`

C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别

 
阅读更多

一般我们进行成员变量初始化用两种方法

第一种是通过在构造函数内赋值

class Point
{
public:
Point(){ _x = 0; _y = 0;};
Point( int x, int y ){ _x = 0; _y = 0; }
private:
int _x, _y;
};

第二种是使用初始化列表

class Point
{
public:
Point():_x(0),_y(0){};
Point( int x, int y ):_x(x),_y(y){}
private:
int _x, _y;
};



这两种用法是有区别的

一、在有些情况下,必须使用初始化列表。特别是const和引用数据成员被初始化时。

class Point
{
// 这个类的定义就要求使用初始化成员列表,因为const成员只能被初始化,不能被赋值
public:
Point():_x(0),_y(0){};
Point( int x, int y ):_x(x),_y(y){}
//Point(){ _x = 0; _y = 0;}
//Point( int x, int y ){ _x = 0; _y = 0; }
private:
const int _x, _y;
};



二、是从效率方面来说的,对于内置类型或复合类型,差异不会太大,但对于非内置数据类型,差异还是很明显的

如我们再给Point类添加一个新的string类型的成员变量

class Point
{
const int _x, _y;
string _name;
};


构造函数内赋值进行初始化

Point( int x, int y, string name ){ _x = 0; _y = 0; _name = name; }


_name = name 这个表达式会调用string类的缺省构造函数一次,再调用Operator=函数进行赋值一次。所以需调用两次函数:一次构造,一次赋值


用初始化列表进行初始化

Point( int x, int y, string name ):_x(x),_y(y), _name(name){}

_name会通过拷贝构造函数仅以一个函数调用的代码完成初始化

即使是一个很简单的string类型,不必要的函数调用也会造成很高的代价。随着类越来越大,越来越复杂,它们的构造函数也越来越大而复杂,那么对象创建的代价也越来越高,所以一般情况下建议使用初始化列表进行初始化,不但可以满足const和引用成员的初始化要求,还可以避免低效的初始化数据成员。

详细出处参考:http://www.itqun.net/content-detail/105800_2.html

http://blog.chinaunix.net/uid-24352482-id-3258146.html

分享到:
评论

相关推荐

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

    构造函数初始化列表是C++中一个非常重要的特性,它允许程序员在对象创建时直接对类中的成员进行初始化,而不是先分配内存再赋值,这在效率和安全性上都有显著优势。 #### 构造函数初始化列表的作用与语法 构造函数...

    C++初始化列表使用

    C++初始化列表是一种在创建对象或构造函数执行时设置成员变量初始值的机制。它以冒号开头,后面跟着一系列用逗号分隔的成员名和对应的初始值。使用初始化列表的原因主要有性能优化和语法要求。 首先,初始化列表在...

    解决C++全局变量只能初始化不能赋值的问题

    C++中,全局变量只能声明、初始化,而不能赋值 也就是说,下面这样是不被允许的: #include using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all...

    C++中成员初始化列表的使用

    本文将详细解释成员初始化列表的概念、用途以及它与传统构造函数内初始化的区别,并通过具体示例来阐述其在特定场景下的应用。 #### 成员初始化列表的基本概念 在C++中,当定义一个类时,可能会包含多种类型的成员...

    C++初始化成员列表.

    C++初始化成员列表 C++语言中的初始化成员列表是一种特殊的语法结构,它允许在构造函数中对类的成员变量进行初始化。这种机制可以解决一些特殊的问题,如成员变量是类类型且没有默认构造函数的类,或者const成员或...

    c++能不能给类的成员变量在声明的时候初始化? - life_limbo - 博客园1

    2. **初始化列表初始化**:接着执行构造函数的初始化列表,其中的初始化顺序与成员变量声明的顺序一致,而不受初始化列表中实际顺序的影响。例如`A(int a_):a(a_){};` 3. **构造函数体内的初始化**:最后执行构造...

    C++关于构造函数的初始化

    本文将深入探讨C++构造函数中的初始化,包括传统的赋值方式、括号赋值、冒号初始化(也称为成员初始化列表)以及函数体初始化。 首先,C++中存在两种初始化方式:赋值运算符赋值和括号赋值。例如: ```cpp int a =...

    C++类成员和数据成员初始化总结

    1. **const、引用和特定类型的成员**(如没有默认构造函数的类类型成员)必须在构造函数的初始化列表中初始化,因为它们不能在构造函数体内赋值。 2. **成员初始化的顺序**并不受它们在构造函数中出现的位置影响,...

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

    - **内置数据类型、复合类型(如指针、引用)**:在成员初始化列表和构造函数体内进行初始化或赋值,在性能和结果上基本没有区别。 - **用户定义类型(类类型)**:虽然结果相同,但效率有很大差异。类类型的数据...

    C++ 构造函数初始化列表的好处

    C++ 类对像构造时,需要对类成员变量完成初始化赋值操作。使用初始化列表完成这步操作在性能上有益处。什么好处呢?摆道理显得不够彻底。看书不如做实验。让我们结合执行过程来查看。考虑如下示例代码:  ...

    C++构造函数_析构函数和赋值操作符学习小结

    C++ 构造函数、析构函数和赋值操作符是 C++ 编程语言中的基本组件,它们提供了对象的初始化、销毁和赋值操作。这些函数的正确性对整个类的正确性至关重要。 构造函数 构造函数是类的特殊成员函数,它们控制对象...

    高质量C++C编程指南 - 第9章 类的构造函数、析构函数与赋值函数.pdf

    "高质量C++编程指南 - 第9章 类的构造函数、析构函数与赋值函数" 本章主要介绍了C++类中的三个基本函数:构造函数、析构函数与赋值函数。这些函数看似简单,但如果不正确地使用它们,可能会导致程序出错。 首先,...

    关于C++类的成员初始化列表的相关问题

    C++类的成员初始化列表是构造函数中一种特殊的形式,用于在对象实例化时直接对类的成员变量进行初始化。...在编写涉及构造函数和成员变量初始化的代码时,应优先考虑使用初始化列表,以确保程序的性能和正确性。

    C/C++高级编程pdf

    3. 初始化列表:在构造函数中,使用初始化列表而非赋值语句来初始化成员变量,以确保正确的数据类型转换和防止不必要的默认构造函数调用。 4. 拷贝构造函数:处理对象间的复制,确保深拷贝和浅拷贝的区别理解。 5. ...

    程序设计中基于构造函数的对象初始化方法研究.zip_C++_suddenh4l

    3. **构造函数初始化列表**:在构造函数内部,使用初始化列表(ctor initialization list)是一种更高效且推荐的方式来初始化成员变量,而不是在函数体中进行赋值。例如: ```cpp class MyClass { private: int ...

    林锐-高质量c/c++编程指南

    9. **类的构造函数、析构函数与赋值函数**:深入讲解构造函数与析构函数的起源、构造函数初始化列表、构造与析构顺序、拷贝构造函数与赋值函数的重要性等。 10. **类的继承与组合**:探索继承与组合两种类间关系的...

    c++(7) 构造和析构函数

    构造函数与析构函数是C++中非常重要的概念,它们对于确保类实例的正确初始化与清理至关重要。本文将详细介绍构造函数与析构函数的相关知识点。 #### 一、构造函数 构造函数是一种特殊成员函数,其主要任务是在对象...

    高质量C/C++编程指南

    - **构造函数的初始化表**:使用初始化列表而非赋值操作来初始化成员变量,可以提高效率并避免潜在问题。 - **构造和析构的次序**:了解成员变量和基类构造函数调用的顺序,对于正确实现类的构造过程至关重要。 - **...

    C++程序设计课件:3 构造函数、析构函数.ppt

    总之,构造函数、析构函数、拷贝构造函数、初始化列表、静态成员、常量、友元和运算符重载等是C++中构建复杂类结构的关键要素,理解并熟练掌握这些知识点对于编写高效、健壮的C++代码至关重要。

    高质量C/C++编程指南(PDF)

    9.2 构造函数的初始化表. 9.3 构造和析构的次序. 9.4 示例:类STRING 的构造函数与析构函数 9.5 不要轻视拷贝构造函数与赋值函数. 9.6 示例:类STRING 的拷贝构造函数与赋值函数 9.7 偷懒的办法处理拷贝构造函数与...

Global site tag (gtag.js) - Google Analytics