C++类成员的初始化
2016-03-29 13:00
483 查看
C++成员的初始化
C++包括的类成员主要由以下几种:非静态非常量数据成员
非静态常量数据成员
静态非常量数据成员
静态常量数据成员
C++初始化基本概念介绍:
C++初始化类的成员方法:初始化列表
构造函数(constructor)
如下代码:
class A { public: int member_var; //成员变量 A(); //构造函数 } A::A():member_var(0) { }
很多人觉得这个构造函数的定义应该只能这样写:
A::A() { member_var=1; }
其实两种方法都可。但是有些情况下,只能用第一种,而且通常情况下用第一种也会效率高些。
其实,第一种方法是真正的初始化(initialization),而在构造函数内实现的“=”操作其实是赋值(assign)。这两种方法的一切区别从这儿开始。区别大概如下:
我们知道普通变量编译器都会默认的替你初始化。他们既能初始化,也能被赋值的,而常量(const)按照其意思只能被初始化,不能赋值。否则与变量就无区别了。所以常量成员(const member)只能用成员初始化列表来完成他们的“初始化”,而不能在构造函数内为他们“赋值”。
我们知道类的对象的初始化其实就是调用他的构造函数完成,如果没有写构造函数,编译器会为你默认生成一个。如果你自定义了带参数的构造函数,那么编译器将不生成默认构造函数。这样这个类的对象的初始化必须有参数。如果这样的类的对象来做另外某个类的成员,那么为了初始化这个成员,你必须为这个类的对象的构造函数传递一个参数。同样,如果你在包含它的这个类的构造函数里用“=”,其实是为这个对象“赋值”而非“初始化”它。所以一个类里的所有构造函数都是有参数的,那么这样的类如果做为别的类的成员变量,你必须显式的初始化它,你也是只能通过成员初始化列表来完成初始化。例如:
class B { ...... } class A { public: B member_b; A(); } A::A():B(...) //你必须显式初始化它,因为他的所有构造函数 //都是有参数的,之后才能被赋值。 { B=...; //因为如上所写,已经初始化了,才能被赋值,否则错误。 }
静态成员不能在类内初始化
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字
原因是静态成员属于整个类,而不是属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员。
静态常量成员可以在类内初始化
1、静态成员不能在类内初始化:Errorclass A { private: static int count = 0; // 静态成员不能在类内初始化 };
2、常量成员不能在类内初始化:Error
class A { private: const int count = 0; // 常量成员也不能在类内初始化 };
3、静态常量成员能在类内初始化:Right
class A { private: static const int count = 0; // 静态常量成员可以在类内初始化 };
必须通过初始化列表来初始化的类型:
常量引用类型
没有默认构造函数的类类型
对于第二类引用类型必须在定义的时候就给一个值,因为引用必须绑定到一个目标上,这通常叫做初始化,如下:
int i = 1; int &j = i;
先定义,再赋值是不行的。
而C++的初始化列表就是用来初始化变量的,一旦进入构造函数体内,初始化阶段就结束了。就无法再给引用变量一个值了。
结论
静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化;静态非常量数据成员只能在类外,即类的实现文件中初始化,也不能在构造函数中初始化,不能在构造函数的初始化列表中初始化;
非静态的常量数据成员不能在类内初始化,也不能在构造函数中初始化,而只能且必须在构造函数的初始化列表中初始化;
非静态的非常量数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表中初始化;
类型 \ 初始化方式 | 类内(声明) | 类外(类实现文件) | 构造函数 | 构造函数初始化列表 |
---|---|---|---|---|
非静态非常量数据成员 | No | No | Yes | Yes (must) |
非静态常量数据成员 | No | No | No | Yes |
静态非常量数据成员 | No | Yes (must) | No | No |
静态常量数据成员 | Yes | Yes | No | No |
相关文章推荐
- 2016第七届蓝桥杯C/C++ B组省赛第三题:凑算式
- if括号中的潜规则
- c++primer(第五版) 第十三章 拷贝控制习题答案
- C语言中的static
- 2016第七届蓝桥杯C/C++ B组省赛第二题:生日蜡烛
- C++简单的图存储
- 一组整数的全排列【C程序】
- C++异常抛出与捕获及处理
- 2016第七届蓝桥杯C/C++ B组省赛第一题:煤球数目
- C++模板快速排序和Stooge排序
- c语言把一个数组里面的部分值直接复制到另外一个数组
- Leetcode 14. Longest Common Prefix
- C++杂谈(一)const限定符与const指针
- C++继承详解
- C语言位运算符:与、或、异或、取反、左移和右移
- Eclipse c/c++开发环境搭建
- VC++的Unicode编程
- 关于c语言#include的用法
- windows下C语言实现soket连接-客户端
- 函数返回数组问题