诡异的编译器行为
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++编译器会在某种程序上改变代码的布局。
总之,不要过分的把编译器的行为相当然,先入为主的思想可能会把自己陷入深深的困境之中。
相关文章推荐
- 路人实拍Waymo无人车:行为诡异,谨慎到让人怀疑人生
- (原创)后置++在不同编译器中的行为
- 行为诡异的子查询与非常用谓词ANY/ALL/SOME
- 组织结构配置文件的诡异行为
- popstate事件在webkit中的诡异行为
- popstate事件在webkit中的诡异行为
- assert 断言的不同编译器行为
- 复制字符串strcpy —— 编译器的诡异
- c++:构造函数(constructor)和析构函数(destructor)中编译器的隐式行为(implicit behavior)
- c++编程思想(一)-------存取控制是编译器行为
- C++虚函数表解析(图文并茂,非常清楚)( 任何妄图使用父类指针想调用子类中的未覆盖父类的成员函数的行为都会被编译器视为非法)good
- 没做过编译器就是被人欺——从一道变态的i++题猜编译器的行为(表达式从左往右扫描,同一变量相互影响)
- 前端复习--js中对象的诡异行为
- 后置++在不同编译器中的行为
- IE之诡异行为
- 后置++在不同编译器中的行为
- AutoResetEvent 的诡异行为
- H5中popstate事件的诡异行为
- 使用系统定义宏,会使得编译器报告诡异的错误,很不容易发现。
- ajax调用action中方法诡异行为