C++的对象构造函数有两种初始化的方法: 1.初始化列表 2.大括号中面赋值 这两种推荐使用另外一种.原因在于使用初始化列表仅仅须要进行一次初始化.而使用大括号内赋值的话首先须要调用默认构造函数初始化,然后再进行赋值,效率上明显前者更优.…
C++类中成员变量的初始化有两种方式:构造函数初始化列表和构造函数体内赋值. 一.内部数据类型(char,int……指针等) class Animal { public: Animal(int weight,int height): //A初始化列表 m_weight(weight), m_height(height) { } Animal(int weight,int height) //B函数体内初始化 { m_weight = weight; m_height = height; } pr…
#include<iostream.h> class A { const int a; int b; }; void main() { A obja; }编译出现如下错误:error C2512: 'A' : no appropriate default constructor available;如果将const去掉就没错了! #include<iostream.h> class A { public: const int a; int b; A(int x):a(x){} };…
  初始化是一个非常重要的语言特性,最常见的就是对对象进行初始化.在传统 C++ 中,不同的对象有着不同的初始化方法,例如普通数组.POD (plain old data,没有构造.析构和虚函数的类或结构体)类型都可以使用 {} 进行初始化,也就是我们所说的初始化列表.而对于类对象的初始化,要么需要通过拷贝构造.要么就需要使用 () 进行.这些不同方法都针对各自对象.在传统C++中可以使用初始化列表如下: #include<bits/stdc++.h> using namespace std;…
类成员的默认初始化顺序是按照声明顺序进行, 如果使用初始化列表初始化成员变量, 则必须按照成员变量的声明顺序进行; 否则, 在变量之间交替赋值时, 会产生, 未初始化的变量去赋值其他变量; 同时GCC, 也会发出警告, 如: 'class::m_xxx' will be initialized after [-Wreorder] 请看下面的代码: template<class t>class array {public:  array(int lowbound, int highbound);…
构造函数与其函数体之间可以添加初始化列表,能对某些对象进行初始化.格式为 类名() : 变量1(参数1),变量2(参数2) { } 1.     父类的对象的构造必须在初始化列表中,如: 子类名(): 父类名(对象参数){} 2.     类中声明为const的成员的初始化必须在初始化列表中,如: class A { private: const int a; const int &r; A(int i); } A::A(int i) :a(i),r(a){} 3.     普通的类数据成员也可…
先总结下: 由于类成员初始化总在构造函数执行之前 1)从必要性: a. 成员是类或结构,且构造函数带参数:成员初始化时无法调用缺省(无参)构造函数 b. 成员是常量或引用:成员无法赋值,只能被初始化 2)从效率上: 如果在类构造函数里赋值:在成员初始化时会调用一次其默认的构造函数,在类构造函数里又会调用一次成员的构造函数再赋值 如果在类构造函数使用初始化列表:仅在初始化列表里调用一次成员的构造函数并赋值 CMyClass::CMyClass() { // 使用赋值操作符 // CString::…
首先回忆下,以前学的const 单独使用const修饰变量时,是定义的常量,比如:const int i=1; 使用volatile const修饰变量时,定义的是只读变量 使用const & 修饰变量时,定义的是只读变量 在类中是否可以定义const成员? 直接来写代码: #include <stdio.h> class Test { private: const int ci; public: // Test() // { // ci=10; // } int getCI() {…
成员的初始化列表和构造函数在对成员指定初值方面是不一样的.成员初始化列表是对成员初始化,而构造函数,是对成员赋值 成员初始化列表使用初始化的方式来为数据成员指定初值, 而构造函数的函数体是通过赋值的方式来给数据成员指定初值. 成员初始化列表是在数据成员定义的同时赋初值, 但是构造函的函数体是采用先定义后赋值的方式来做. 这样就限制了,有些情况必须用成员初始化列表. 在这四种情况下是必须要使用成员初始化列表来为这些类型的成员赋初值的: 初始化一个引用成员变量 初始化一个const变量 当我们在初始…
0.目录 1.类成员的初始化 2.类中的const成员 3.对象的构造顺序 3.1 局部对象的构造顺序 3.2 堆对象的构造顺序 3.3 全局对象的构造顺序 4.对象的析构顺序 5.小结 1.类成员的初始化 类中是否可以定义const成员? 下面的类定义是否合法?如果合法,ci的值是什么,存储在哪里? (会报错) C++中提供了初始化列表对成员变量进行初始化 语法规则: 注意事项: 成员的初始化顺序与成员的声明顺序相同 成员的初始化顺序与初始化列表中的位置无关 初始化列表先于构造函数的函数体执行…
1,初始化列表是在 C++ 中才引入的: 2,以“类中是否可以定义 const 成员?”这个问题来引入初始化列表: 1,const 这个关键字可以定义真正意义上的常量,也可以在某些情况下定义只读变量: 3,小实验: 1,下面的类定义是否合法?如果合法,ci 的值是什么,存储在哪里? #include <stdio.h> class Test { private: const int ci; // const 作用于 C++ 中的成员变量后得到的是只读成员变量,只读成员变量是不可以出现在成员符号…
原文链接 https://www.cnblogs.com/dishengAndziyu/p/10906081.html 参考链接:https://www.cnblogs.com/laiqun/p/5776212.html https://blog.csdn.net/zzyczzyc/article/details/87542418 https://www.cnblogs.com/cthon/p/9178701.html http://blog.sina.com.cn/s/blog_4c79cc4…
http://blog.csdn.net/iceshirley/article/details/5688696 要理解这个问题,从概念上,我们要知道一点,那就是构造函数的执行过程会分成两个阶段:隐式或显示的初始化阶段以及一般的计算阶段.计 算阶段由构造函数体内的所有语句组成,在计算阶段,数据成员的设置被认为是赋值,而不是初始化. 而初始化是显式的还是隐式的,取决于是否存在初始化函数列表.隐式初始化阶段按照声明的顺序依次调用素有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数. 现在我们回归…
转自:http://www.cnblogs.com/kaituorensheng/p/3477630.html 1. 类成员为const类型 2. 类成员为引用类型 #include <iostream> using namespace std; class A { public: A(int &v) : i(v), p(v), j(v) {} void print_val() { cout << "hello:" << i <<…
1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中Elem4 2,如果类的成员变量中含有const成员变量,如果不使用列表,在构造函数中是不能对其赋值的,会导致编译失败.下例中b 3,如果类的成员变量中含有引用,引用必须被初始化.下例中c 4,需要提高效率的时候,如果不使用初始化列表,而放在构造函数体内赋值的方法,则变量先被默认构造函数初始化,然后又…
已经有个构造函数负责初始化,为什么还需要构造函数初始化表呢? 在以下三种情况下需要使用初始化成员列表:一,需要初始化的数据成员是对象的情况:二,需要初始化const修饰的类成员:三,需要初始化引用成员数据: 需要初始化引用成员数据 最近才发现C++可以定义引用类型的成员变量,引用类型的成员变量必须在构造函数的初始化列表中进行初始化.对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起)因此只能用初始化列表对齐进行…
1. 构造函数执行分为两个阶段: a.初始化阶段(初始化) 初始化阶段具体指的是用构造函数初始化列表方式来初始化类中的数据成员. ClassXX:val(a),key(b){}; b.普通计算阶段(赋值) 给类中的数据成员重新赋值,会覆盖初始化阶段数据成员的值. ClassXX{val = a,key = b}; 这两个阶段按照顺序执行. 对于普通数据成员而言,其值的设定可以放在 初始化阶段或者普通计算阶段完成. 对于  const类型和&引用类型数据成员,其初始化必须在初始化阶段完成.若通过…
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public: point(int m=0,int n=0) {  x=m;  y=n; }  int GetX() {  return x; } int GetY() {  return y; }}; 2,还可以定义初始化成员列表(Initializer list)来初始化成员数据(data member).…
C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point{private: int x,y;public: point(int m=0,int n=0) {  x=m;  y=n; }  int GetX() {  return x; } int GetY() {  return y; }}; 2,还可以定义初始化成员列表(Initializer list)来初始化成员数据(data member).…
上代码 #include <iostream> using namespace std; class A { public: A(int v): j(v + 2), i(j) {} void print_val() { cout << "hello:" << i << " " << j << endl;} private: int i; int j; }; int main(int argc ,…
三种情况下,必须在构造函数初始化列表中初始化成员: 1.const成员 2.引用成员 3.没有默认构造函数的成员…
如果一个类是这样定义的: Class A { public: A(int pram1, int pram2, int pram3); privite: int a; int &b; const int c; } 假如在构造函数中对三个私有变量进行赋值则通常会这样写: A::A(int pram1, int pram2, int pram3) { a=pram1; b=pram2; c=pram3; } 但是,这样是编译不过的.因为常量和引用初始化必须赋值.所以上面的构造函数的写法只是简单的赋值,…
例题来看:请问下面程序打印出的结果是什么? #include <iostream> #include <string> using namespace std; class base { private: int m_i; int m_j; public: base(int i):m_j(i),m_i(m_j); ),m_i(m_j){} int get_i() {return m_i;} int get_j() {return m_j;} }; int main(int argc…
最近有点忙,先发一篇我公众号的文章,以下是原文. /********原文********/ 最近很多学习Qt的小伙伴在我的微信公众号私信我,该如何理解下面段代码的第二行QWidget(parent) 1 Widget::Widget(QWidget *parent) : 2 QWidget(parent) 3 { 4 } 为了统一回复大家,小豆君特意写了这篇文章,方便初学者们学习. 在讲解原因之前,先请大家看下面的一个例子 #include <iostream> using namespace…
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: class TestClass1 { public: TestClass1() { cout << "TestClass1()" << endl; } TestClass1(const TestClass1&) { cout << "TestClass1(const TestClass1&)" << endl; }…
看下面代码, 输出结果是多少呢? class A{ public: A(int k) : j(k), i(j) { } void show() { cout << this->i << endl; cout << this->j << endl; } private: int i; int j; }; void test() { A a(3); a.show(); } int main(int argc, char const *argv[])…
破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性——初始化列表,概念就不说了,就讲下这东西具体怎么用吧,就是正常的写一个构造函数,然后把参数改为initializer_list<数据类型> &t 如图所示. 可以理解为传入的参数数据被放到了一个储存器t中,利用C++11的auto可以直接遍历这个储存器t,然后把遍历到的值给结构体用.这里…
明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代表"擦除对象当前值, 赋予新值". 它不承担为对象分配内存的义务. 2. C++中, 类成员的初始化于初始化列表中完成, 先于构造函数体执行. 即成员真正的初始化发生在初始化列表中, 而不是构造函数体中. 再给说明.1. 如果类中有一个成员是一个引用, 由于引用必须给予初始值, 因此, 引…
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:    int a;    float b;    //构造函数初始化列表    CExample(): a(0),b(8.8)    {}    //构造函数内部赋值    CExample()    {        a=0;        b=8.8;    }}; 上面的例子中两个构造函数的结果是一…
1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行. 例如: class Complex{ private: double real; double imag; public: Complex(double r,double i) //声明构造函数原型 { ........... } }; Complex::Complex(double r,double i) //在构造函数中用赋值语句对数据成员赋初值 { real = r; imag = i; } 2.另一种初始化数据成员的…