一 1c++对象构造函数:
创建一个对象分成两个步骤,首先取得对象所需的内存,然后在该内存上执行构造函数。在构造函数构建该对象的时候,构造函数也分成两步:先执行初始化(通过初始化列表),再执行构造函数的函数体。。。。。这意味着,如果在构造函数函数体内为成员变量执行赋值操作,显然属于浪费,初始化成员变量通过构造函数的初始化列表赋予成员变量,而不是在构造函数体内进行这些初始化,因为进入构造函数体时,这些成员变量已经初始化一次了
class Aclass
{ public:
Aclass(): i(10) , name("unnamed") //初试化列表
{
......
}
private:
int i;
string name;
}
2 对象创建/销毁 创建和销毁对象经常会成为一个程序性能瓶颈所在,因此有必要对临时对象的产生进行探究和规避。
减少对象创建和销毁的一个很简单且常见的方法就是在函数声明中将所有的值传递改为引用传递或常量引用传递。
int foo ( Object a ); // 值传递,会产生一个局部对象(复制原对象),调用结束后销毁复制得到的局部对象
int foo ( Object& a ); // 引用传递 , 传入原对象的地址,函数体内的改动都是针对原对象
int foo ( const Object& a );// 常量引用传递,传入 原对象的地址,并定义为常量,这样函数不能对原对象修改,只能读取。
Object foo2 ( Object a ) ;// 会产生两个临时对象,一个是值传递,一个是返回值
3 非内建类型的对象
a 尽量将对象延迟到已经确切知道其有效状态时创建,这样可以减少临时对象的生成。
aclass c = a+ b;要优于
aclass c;
c = a+b;
b operator += 不产生临时对象,性能会比operator + 要好。同样对于 -=和 -.....
c 保证程序语意正确的前提下,应该多用 ++i 少用 i++。同样对于 --i 和 i--。
4 临时对象的生命周期
string a,b;
const char* str;
.................
if( strlen( str = (a+b).c_str() ) >5 )
{ printf ("%s\n", str ); }
这个程序的运行结果是无法预料的,原因在于 存放 a+b的值的临时对象的生命在包含其最长语句结束后也相应的结束了。在执行到 printf时,该临时对象已经不存在了,字符串内容那个的str指向一段已经被收回的内存。这是的结果是无法预测的。
5 内联函数的正确使用