1.在使用字符+个数初始化string时,写成了string(’ ‘,123),其实是string(123,’ ');和顺序容器的初始化时一样的,但是不知道为什么脑抽,一直写成反的,而且之前还编译通过了一次。。
2.在包含内置指针的类中,定义赋值运算符,忘记检测传入的对象是否是当前对象本身。以及忘记销毁内置指针当前指向的对象。
3.调用函数时,会在调用出生成一个临时的对象,这在C++ Primer中是写了的,但是我忘记了,结果看到运算结果百思不得其解怎么会多了一次构造。
下面的代码func中调用一次构造,然后在返回处生成一个临时对象初始化a,按道理来说生成临时对象会调用一次拷贝构造,然后改临时对象用于初始化a,会再调用一次拷贝构造,但是编译器似乎是做了优化,下面的调用只产生了一次构造和一次拷贝构造。
class A {
public:
A() {
cout << "A()" << endl;
}
A(const A&) {
cout<<"const A&"<<endl;
}
A& operator =(const A& a) {
cout << "operator=" << endl;
return *this;
}
};
A func() {
A a;
return a;
}
A a = func();
但是如果这么写,则会调用了一次构造,一次拷贝构造,一次赋值。
A a ;
a= func();
如果函数直接返回匿名对象:
A func() {
return A();
}
则下面的代码只发生了一次构造
A a = func();
而下面的代码则产生了一次构造,一次赋值
A a ;
a= func();
可以看到编译器做了优化,如果直接返回匿名对象,相当于将匿名对象直接放在调用处。
使得
A a = func();
等价于
A a = A()
A a();
A a ;
a= func();
等价于
a= A();