类中有const修饰的变量,所以只能用初始化列表对其进行初始化,而不能用备注释的那个构造函数进行初始化,谁能说说初始化列表的机制是什么?它到底是怎么实现的?我用反汇编看了,2钟方法的汇编是一样的,如果没看错的话一模一样啊。

#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;
}

推荐图书

  • C++ Primer中文版(第4版)
  • More Effective C++:35个改善编程与设计的有效方法(中文版)
  • 设计模式:可复用面向对象软件的基础


1个回答

初始化列表是“先使用这个列表中的参数调用各成员变量的构造函数来构造成员变量,然后再调用类的构造函数来构造类” 你注释的构造函数是“先使用默认构造函数来构造成员变量,再调用构造函数来构造类,在这个构造函数中给成员变量赋值”

反汇编一模一样不稀奇,因为功能是一模一样的

const原本就是用来限制程序员自己的,编译成可执行文件后不存在const这种东西

int a = 0;和int a;a=0;反汇编之后的结果十有八九也是一模一样的,哪个能用const哪个不能用,我想你应该很明白