Skip to content

Commit

Permalink
修改
Browse files Browse the repository at this point in the history
  • Loading branch information
arkingc committed Jul 26, 2018
1 parent d06a8b4 commit abc21a9
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions C++/C++对象模型.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@ void foo_bar()
上述代码是否会合成默认的拷贝构造函数?首先需要提到2个需要:
* **编译器的需要**
* **程序员的需要**:上述代码就是“程序员的需要”,在这种情况下,为成员执行初始化应该是程序员的责任
* **程序的需要**:上述代码就是“程序的需要”,在这种情况下,为成员执行初始化应该是程序员的责任
那么在来考虑是否会合成拷贝构造函数:
* 在**C++ Annotated Reference Manual(ARM)**中:只有编译器需要时才会合成,所以上面的代码不会合成默认的拷贝构造函数
* 在**C++ Annotated Reference Manual**(**ARM**)中:只有编译器需要时才会合成,所以上面的代码不会合成默认的拷贝构造函数
* **C++ Standard**:如果没有任何用户声明的构造函数,那么会有一个默认构造函数被隐式声明,但是这样被隐式声明的默认构造函数的trival(浅薄无能,没啥用)constructor。只有当一个默认构造函数是nontrivial时,才会被合成出来。所以,如果按照C++标准,上面的代码会声明一个trivial的默认构造函数,但是因为是tivial,所以并不会合成
有4种情况,会造成“编译器必须为未声明构造函数的类合成一个默认构造函数”,即nontrivial的默认构造函数:
Expand Down Expand Up @@ -167,6 +167,8 @@ int main(){

**编译器会对初始化列表一一处理并可能重新排序,以反映出成员的声明顺序。它会安插一些代码到构造函数体内,并置于任何显示用户代码(explicit user code)之前**

<br>

> 和默认构造函数、拷贝构造函数相关的问题:是否可以使用memset来初始化一个对象、使用memcpy来拷贝一个对象?只有在”class不含任何由编译器产生的内部members“时才能有效运行。如果class声明一个或一个以上的virtual functions,或内含一个virtual base class,那么使用上述函数将会导致那些”被编译器产生的内部members“的初值被改写
>
> ```c++
Expand Down

0 comments on commit abc21a9

Please sign in to comment.