前言
被一道题目困扰了好久,搞死我了。一直学Java的我,根本不知道C++竟然有这种神仙玩意儿,实属给我整懵了。
它是个啥
-
Initializers List
-
顾名思义,就是初始化 ,但和构造函数的赋值不同的是
- 初始化列表在对象被构造前执行
- 构造函数的赋值是在构造时执行
使用
- "a(value)" 即 “a = value”
搞我的题目
- 要求输出
5,5
5,5
#include <iostream>
using namespace std;
class Base
{
public:
int k;
Base(int n):k(n) {}//类型转换构造函数
};
class Big
{
public:
int v;
Base b;
/*
题目原来是:
Big【 】
Big【 】
【填空题】
*/
Big
Big
};
int main()
{
Big a1(5);
Big a2 = a1;
cout << a1.v << "," << a1.b.k << endl;
cout << a2.v << "," << a2.b.k << endl;
return 0;
}
-
咱来分析一下,观察一下Big的成员变量
- int v
- Base b
-
巧了,Base是个类,那我们再看看Base类
class Base
{
public:
int k;
Base(int n):k(n) {}//类型转换构造函数
};
-
很容易看到,它没有无参构造函数,它不像Java那样有默认无参构造啊!!!而,Big类里面,直接Base b,没有初始化,动不动就给你丢个“no match”恶心你。
-
那咋办??对象创建了,得构造啊!!!!成员变量不都得准备好嘛!!!!
-
所以,只要我
E得够快初始化在构造之前,不就行了吗!!!!!! -
所以用到我们的初始化列表:
Big():b(0){this->v=0;}
Big(int n):b(n){this->v = n;}
好言相劝
- 所以呀,以后凡是要构造赋值的,直接整这个就完了!!!a(v)
出答案了哈哈哈哈哈哈,写错了,尴尬的一批
我的原答案:
// 题目没说要0,这边要写的应该是【拷贝构造】!!!
Big():b(0){this->v=0;}
// 要用初始化列表就都用,不要用一半,{}空着就空着
Big(int n):b(n){this->v = n;}
老师给的答案:
Big(const Big& a):v(a.v),b(a.b.k){}
Big(int n):v(n),b(n){}