常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。
来源:互联网 发布:淘宝刷粉丝刷收藏软件 编辑:程序博客网 时间:2024/05/17 01:00
常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。
using namespace std;
class StudentID{
public:
StudentID(int id){
value =id
cout<<"Assigning student id "<<value<<endl;
}
~StudentID(){
cout<<"Destructing id " << value <<endl;
}
protected:
int value;
}
class Student{
public:
Student(char * pName="noName",int ssID=0){
cout<<"Constructing student "<<pName<<endl;
strcpy(name,pName);
name[sizeof(name)-1]='\0';
StudentID id(ssID);
}
protected:
char name[20];
StudentID id;
}
int main(){
Student s("Randy",9818);
}print:
Assigning student id 0
Constructing student Randy
class B{
}
class A{
public:
A():number(n),ref(r),b(b1){...}
private:
const int number;
int & ref;
B b;
}
那为什么是常量,引用,对象成员这三者不可以直接初始化,而要放在成员初始化表中呢?
1.对于常量:
常量是不可以被赋值的,不能在创建对象的时候点取常量成员然后赋值给它.
A a;
a.number=10; // error;
更加不可以直接就在类的定义中赋值
class A{
const int number=10;
}
因为每个对象的number可能是不一样的,这样直接赋值的话,就是要求类的所有对象的number都是固定的,这样很明显不合逻辑。
另外,有些书认为这样是在给常量赋值,所以是不允许的。
2.对于引用:
引用本质上来讲也是一种常量,那么它也是不可重新指派的,初始化之后就固定不变。
3.对于对象成员:
对象成员出现在成员初始化表上,实际上相当于调用该对象所属类的构造函数,b(b1)即是以b1为参数调用B的构造函数。
如果不这样做的话,要实现初始化似乎只能传递对象参数生成临时对象来实现,这样的话,根本没有起到初始化的作用。
请看例子:
#include <iostream>using namespace std;
class StudentID{
public:
StudentID(int id){
value =id
cout<<"Assigning student id "<<value<<endl;
}
~StudentID(){
cout<<"Destructing id " << value <<endl;
}
protected:
int value;
}
class Student{
public:
Student(char * pName="noName",int ssID=0){
cout<<"Constructing student "<<pName<<endl;
strcpy(name,pName);
name[sizeof(name)-1]='\0';
StudentID id(ssID);
}
protected:
char name[20];
StudentID id;
}
int main(){
Student s("Randy",9818);
}print:
Assigning student id 0
Constructing student Randy
Assigning student id 9818 // 当传递9818给StudentID id(ssID)的时候,调用StudentID的构造函数,这样就在Student的构造函数产生了一个局部对象
Destructing id 9818 // 当Student的构造函数对象结束的时候,该对象就析构了,那么id 9818就没有了,实际上9818没有初始化Randy的id;
Destructing id 9818 // 当Student的构造函数对象结束的时候,该对象就析构了,那么id 9818就没有了,实际上9818没有初始化Randy的id;
Destructing id 0 // Randy的id仍然为0,程序结束的时候析构。
构造对象的顺序--按照成员属性声明的顺序,而不是成员初始化表的顺序。
静态对象之构造一次。
所有全局对象在main()函数之前被构造,且一般按照声明的顺序。
- 常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。
- 类成员的初始化--成员初始化列表(常量,引用,成员对象)
- 在类中对常量成员进行初始化
- C++类中引用成员和常量成员的初始化(初始化列表)
- 为什么结构体/类中,成员变量可以初始化不可以赋值?
- 在类中初始化常量成员变量的方法
- 派生类不能在成员初始化列表中直接初始化基类的成员
- 派生类不能在成员初始化列表中直接初始化基类的成员
- 静态常量整数成员在class内部直接初始化
- C++中引用成员的初始化
- C++常量和引用数据成员的初始化
- 静态成员常量初始化
- 常量成员初始化
- C++ 类中特殊成员变量(常量、静态、引用)的初始化方法
- 复杂对象的静态常量成员的初始化
- c++类中对数据成员进行初始化和赋值的区别
- 类中静态变量与const常量成员的初始化
- c++中静态数据成员与常量的初始化
- InstallShield利用环境变量得到INSTALLDIR,结合custom action来实现完全卸载
- 对A*算法的路径进行优化
- GARCH MODEL in R, Sample Code for GARCH(1,1)
- c+中如何查看一个类的内存布局
- OCJP之国际化 更新中
- 常量,引用,对象成员的初始化要在成员初始化表中进行,不可以直接=号赋值。
- OCJP之javac,java,jar命令
- lucene索引:改变索引打分的四种方式(
- 安装maven
- 庖丁解牛 分词
- 提供各种开源软件编译服务的想法
- Design Pattern_State(状态机模式)
- 来一篇英语美文赏析:品味现在,放眼未来
- MapReduce 技术基础介绍(一)