必须在构造函数基/成员初始值设定项列表中初始化

转载:https://www.cnblogs.com/zzyoucan/p/3570493.html?utm_source=tuicool&utm_medium=referral

C++ primer 上面的一个例子:

 1 // constRef.cpp : 定义控制台应用程序的入口点。
 2 //
 3  
 4 #include "stdafx.h"
 5  
 6 class constRef
 7 {
 8 public:
 9  constRef(int ii);
10  
11  int i;
12  const int ci;
13  int &ri;
14 };
15  
16 constRef::constRef(int ii)
17 {
18  i=ii;
19  ci=ii;
20  ri=i;
21 }
22  
23 //constRef::constRef(int ii):i(ii),ci(i),ri(ii){}
24  
25 int _tmain(int argc, _TCHAR* argv[])
26 {
27  constRef B(5);
28  
29  printf("%d,%d,%d",B.i,B.ci,B.ri);
30  return 0;
31 }

 这样写是有错误的,error C2758: “constRef::ci”: 必须在构造函数基/成员初始值设定项列表中初始化;

constRef::ri”: 必须在构造函数基/成员初始值设定项列表中初始化;
error C2166: 左值指定 const 对象;
而将
 
constRef::constRef(int ii)
{
 i=ii;
 ci=ii;
 ri=i;
}
 
使用constRef::constRef(int ii):i(ii),ci(i),ri(ii){} 替换 就正确了,你知道原因吗?
 
记住:可以初始化const对象或引用类型的对象,但不能对他们赋值。在开始执行构造函数的函数体之前,必须完成初始化。初始化const或引用类型数据成员的唯一机会是在构造函数初始化列表中。
原文地址:https://www.cnblogs.com/Toya/p/13731262.html