C++构造函数初始化列表与赋值

C++中类的初始化操作一般有四个部分组成:

1.构造函数初始化列表

2.构造函数体内赋值

3.类外部初始化

4.类声明时直接赋值

对于内部数据类型(char,int,float...),构造函数初始化列表和构造函数体内赋值,基本上没多大区别,效率差异也不大,但两者不能共存:

class Student
{
public:
    Student(char *name, int age):       //A初始化列表
      m_name(name),
      m_age(age)
    {
    }
      Student(char *name, int age)       //B函数体内初始化
    {
        m_name = name;
        m_age = age;
    }
private:
    char *m_name;
    int   m_age;
};

对于类类型来说,最好是使用初始化列表方式,使用初始化列表相对构造函数方式少了一次调用默认构造函数的过程,这对于数据密集型的类来说,性能更加高效;

**初始化列表方式:所有类非静态数据成员都可以在这里初始化,且成员变量初始化的顺序是按照头文件定义的顺序进行的,但类静态数据成员不能在这里初始化;

**构造函数体内部方式:

对于类非静态成员,const型、引用型以及没有默认构造函数测成员不能在这里初始化;

[1] 常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面

[2] 引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面

[3]没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化

对于类静态成员,可以在这里修改可修改的静态成员,但静态成员必须已经在类外部初始化;

**类外部初始化方式:类似static const int数据成员可以在类外部初始化,也可以在类成员的声明处初始化;其他static数据成员必须在类外部初始化;

**类中声明方式:类似static const int数据成员可以在类成员的声明处初始化;

时间: 2024-11-17 21:21:49

C++构造函数初始化列表与赋值的相关文章

C++中构造函数初始化列表为什么会比构造函数中赋值要高效

Test { Test(test& t1) { this->t=t1; } private: test t; } 相信很多人跟我一样,非常困惑为什么Test构造时会先调用test的构造函数,再调用test类的赋值操作符.那是因为赋值操作符不能产生新的对象,Test构造时免不了要构造一个test对象.所以正常流程是 先构造t,然后再调用赋值操作符赋值t(this->t=t1). 如果写成 Test { Test(test& t1):t(t1) { } private: test

构造函数初始化列表和构造函数体内赋值

#include <iostream> using namespace std; class A{ public: A(int a,string str) { m_a = a; m_str = str; } //A(int a,string str):m_a(a),m_str(str){} void print() { cout << m_a << ' '<< m_str<< endl; } private: int m_a; string m_

转:C++类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample { public:     int a;     float b;     //构造函数初始化列表     CExample(): a(0),b(8.8)     {}     //构造函数内部赋值     CExample()     {         a=0;         b=8.8;     } }; 上面的例子中两个构造函数的结果是一样

C++之类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class Example { public: int a; float b; //构造函数初始化列表 CExample(): a(0),b(8.8) {} //构造函数内部赋值 CExample() { a=0; b=8.8; } }; 例子中两个构造函数的结果是一样的.上面的构造函数(使用初始化列表的构造函数)显式的初始化类的成员:而没使用初始化列表的构造函数是对类的成员赋值

C++类构造函数初始化列表

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:    int a;    float b;    //构造函数初始化列表    CExample(): a(0),b(8.8)    {}    //构造函数内部赋值    CExample()    {        a=0;        b=8.8;    }}; 上面的例子中两个构造函数的结果是一样的.上面的构造函数(使用初

20160403_C++初始化列表与赋值

引用自:http://www.cnblogs.com/BlueTzar/articles/1223169.html 1. 两种初始化方式:构造函数初始化列表 和 构造函数内部赋值 (1) 构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式. class CExample { public: int a; float b; // 构造函数初始化列表 CExample(): a(0),b(8.8) { // a赋值为0,b

C++类构造函数初始化列表(转)

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: { public:     int a;     float b;     //构造函数初始化列表     CExample(): a(0),b(8.8)     {}     //构造函数内部赋值     CExample()     {         a=0;         b=8.8;     } }; 上面的例子中两个构造函数的结果是一样的.上面的构造函数(使用初始化

const成员或者引用成员必须使用构造函数初始化列表的方式

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

构造函数初始化列表

构造函数初始化列表有时是必要的.虽然构造函数分为初始化和计算阶段,使用初始化构造函数列表效率要高一些,这是其一,而且有些情况下必须使用,下面是一例, 1 class Foo 2 { 3 public: 4 Foo(int x, int y): a(x), b(y) {} 5 6 private: 7 int a; 8 int b; 9 }; 10 11 class Bar 12 { 13 public: 14 Bar(): foo(10, 10) {} 15 private: 16 Foo fo