关于初始化列表和构造函数的有关问题
关于初始化列表和构造函数的问题
类中有const修饰的变量,所以只能用初始化列表对其进行初始化,而不能用备注释的那个构造函数进行初始化,谁能说说初始化列表的机制是什么?它到底是怎么实现的?我用反汇编看了,2钟方法的汇编是一样的,如果没看错的话一模一样啊。
------解决方案--------------------
初始化列表是“先使用这个列表中的参数调用各成员变量的构造函数来构造成员变量,然后再调用类的构造函数来构造类”
你注释的构造函数是“先使用默认构造函数来构造成员变量,再调用构造函数来构造类,在这个构造函数中给成员变量赋值”
反汇编一模一样不稀奇,因为功能是一模一样的
const原本就是用来限制程序员自己的,编译成可执行文件后不存在const这种东西
int a = 0;和int a;a=0;反汇编之后的结果十有八九也是一模一样的,哪个能用const哪个不能用,我想你应该很明白
------解决方案--------------------
你注释的那种不叫初始化,而是赋值。
------解决方案--------------------
程序执行基本的两个步骤,
1:初始化 2:执行运算代码
构造函数既是初始化的一部分,也是运算的一部分,其中构造函数的初始化就是靠初始化列表功能完成的,
我猜测,构造函数的初始化部分应该是定义一个对象后,在对象最终创建成功前执行的,然后再开始执行构造函数体,瞎猜的。嘎嘎。
------解决方案--------------------
1楼说得对, 对于二进制的可执行代码来说, 根本就没有什么const的概念, 否则就不会有那么多外挂了.
这只是C++语法的规定罢了. 至于原理,确实也不知道.
等下面的朋友来解答
------解决方案--------------------
构造函数执行分为两个阶段:
1,是初始化阶段,所有没有定义默认构造函数,const以及引用类型的对象必须在这里初始化;
2,是运算阶段,当初始化完成以后,就开始执行函数体,所以你注释的不是初始化,那叫赋值运算;
------解决方案--------------------
楼主,老看汇编是学不好C++的。要多看正确的教材。
类中有const修饰的变量,所以只能用初始化列表对其进行初始化,而不能用备注释的那个构造函数进行初始化,谁能说说初始化列表的机制是什么?它到底是怎么实现的?我用反汇编看了,2钟方法的汇编是一样的,如果没看错的话一模一样啊。
- C/C++ code
#include <iostream> using namespace std; class HasPtr { public: HasPtr(int *p, int i):ptr(p), val(i){ } // HasPtr(int *p, int i) // { // ptr = p; // val = i; // } int get_ptr_val() const { return *ptr; } void set_prt_val(int val) const { *ptr = val; } private: int *ptr; const int val; }; int main(void) { int i = 42; HasPtr p1(&i, i); HasPtr p2(p1); cout << p2.get_ptr_val() << endl; p1.set_prt_val(4); cout << p2.get_ptr_val() << endl; cout << p1.get_ptr_val() << endl; p2.set_prt_val(5); cout << p1.get_ptr_val() << endl; return 0; }
------解决方案--------------------
初始化列表是“先使用这个列表中的参数调用各成员变量的构造函数来构造成员变量,然后再调用类的构造函数来构造类”
你注释的构造函数是“先使用默认构造函数来构造成员变量,再调用构造函数来构造类,在这个构造函数中给成员变量赋值”
反汇编一模一样不稀奇,因为功能是一模一样的
const原本就是用来限制程序员自己的,编译成可执行文件后不存在const这种东西
int a = 0;和int a;a=0;反汇编之后的结果十有八九也是一模一样的,哪个能用const哪个不能用,我想你应该很明白
------解决方案--------------------
你注释的那种不叫初始化,而是赋值。
------解决方案--------------------
程序执行基本的两个步骤,
1:初始化 2:执行运算代码
构造函数既是初始化的一部分,也是运算的一部分,其中构造函数的初始化就是靠初始化列表功能完成的,
我猜测,构造函数的初始化部分应该是定义一个对象后,在对象最终创建成功前执行的,然后再开始执行构造函数体,瞎猜的。嘎嘎。
------解决方案--------------------
1楼说得对, 对于二进制的可执行代码来说, 根本就没有什么const的概念, 否则就不会有那么多外挂了.
这只是C++语法的规定罢了. 至于原理,确实也不知道.
等下面的朋友来解答
------解决方案--------------------
构造函数执行分为两个阶段:
1,是初始化阶段,所有没有定义默认构造函数,const以及引用类型的对象必须在这里初始化;
2,是运算阶段,当初始化完成以后,就开始执行函数体,所以你注释的不是初始化,那叫赋值运算;
------解决方案--------------------
楼主,老看汇编是学不好C++的。要多看正确的教材。