您的位置:首页 > 其它

诡异的编译器行为

2011-04-17 15:54 106 查看

先看几个例子:

例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++编译器会在某种程序上改变代码的布局。

总之,不要过分的把编译器的行为相当然,先入为主的思想可能会把自己陷入深深的困境之中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: