先看几个例子:
例1:
class A
{
public:
inline void get(){cout<<"a"<<endl;}
};
A a;
a.get();
//这里,内联函数会展开吗。
//答案是不会,因它里边包含了函数调用,编译器会把内联忽略掉
例2:
class A
{
public:
A(A& a){this->x = 555;}
A& operator=(int b)
{
this->x = 444;
return *this;
}
int x;
}
A a;
a = 2;
cout<<a.x<<endl;
是否正确,答案是正确。
输出结果是多少?
可能第一感觉是要么就444,要么就555,结果是2.
例3:
class A
{
int a;
};
编译器是否会为这个类添加构造函数、析构函数、赋值函数、拷贝构造函数?
答案是不一定,得看需要而定。
结论:
编译器会为我们做很多事情,很多时候,编译器生成的代码已经跟我们想要的代码差很多了。
编译器不一定会为每个类生成构造函数、析构函数、赋值函数、拷贝构造函数。
也不一定复制的时候就调用代码中的拷贝构造函数,C++编译器会在某种程序上改变代码的布局。
总之,不要过分的把编译器的行为相当然,先入为主的思想可能会把自己陷入深深的困境之中。