诡异的编译器行为

来源:互联网 发布:移动应用 框架 知乎 编辑:程序博客网 时间:2024/04/19 07:53

先看几个例子:

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

总之,不要过分的把编译器的行为相当然,先入为主的思想可能会把自己陷入深深的困境之中。

 

 

原创粉丝点击