-
C++教程之构造函数的参数初始化表
构造函数的参数初始化表
如果类对象的某些数据成员没有载构造函数内部被初始化,那么必须使用构造函数的参数初始化表对他们进行初始化。否则,编译器不止到该如何初始化这些还等着在构造函数内部赋值的成员。我们习惯用参数初始化表来初始化所有数据成员。
class Date
{
int mo,da,yr;
public:
Date(int m=0,int d=0,int y=0);
};
class Employee
{
int empno;
Date datehired;
public:
Employee(int en,Date& dh);
};
可以用下面两种方法编写Employee类的构造函数:
Employee::Employee(int en,Date& dt)
{
empno=en;
datehired=dh;
}
或者;
Employee::Employee(int en,Date& dt):empno(en),datehired(dh)
{
//empty
}
虽然这两种方法效果是一样的,但是根据Date对象默认构造函数的复杂性的不同,这两种形式的效率差别是很大的。
四、对const修饰符的简单说明
如果一个对象被声明为常量,那么该对象就不可以调用类当中任何非常量型的成员函数(除了被编译器隐式调用的构造函数和析构函数)。看下面的代码;
#include iostream.h
class Date
{
int month,day,year;
public:
Date(int m,d,y):month(m),day(d),year(y) {}
void display()
{
cout<<MOTH<<' ?<<year<<endl;
}
}
int main()
{
const Date dt(4,7,2004);
dt.display(); //error
return 0;
}
这个程序尽管编译时没有问题,但运行时却出错了。这是因为常量对象不能调用非常量函数。编译器只看函数的声明,而不在乎函数的具体实现。实际上函数的实现可以在程序中的任何地方,也可以是在另一个源代码文件中,这就超过了编译器的当前可见范围。
//date.h
class Date
{
int month,day,year;
public:
Date(int m,d,y);
void display();
};
//date.cpp
#include iostream.h
#include date.h
Date::Date(int m,d,y):month(m),day(d),year(y) {}
void Date::display()
{
cout<<MONTH<<' ?<<year<<endl;
}
//program.cpp
#include iostream.h
#include date.cpp
int main()
{
const Date dt(4,7,2004);
dt.display();
return 0;
}
解决出错的问题有两个方法:第一是声明display()函数为常量型的
//in date.h
void display() const
//int date.cpp
void Date::display() const
{
cout<<MONTH<<' ?<<year<<endl;
}
另一个解决方式就是省略掉Date对象声明里的const修饰符。
Date dt(4,7,2004);
还有另一个容易出错的地方:
void abc(const Date& dt)
{
dt.display(); //error 提示display没有const修饰符
}
函数abc()声明了一个Date对象的常量引用,这说明该函数不会修改传递进来的参数的值。如果Date::display()函数不是常量型的,那么在函数abc()里就不能调用它,因为编译器会认为Date::display()函数有可能会修改常量的值。
不论类对象是否是常量型的,它必须修改某个数据成员的值时,ANSI委员会设立了mutable关键字。
五、可变的数据成员
假设需要统计某个对象出现的次数,不管它是否是常量。那么类当中就应该有一个用来计数的整型数据成员。只要用mutable修饰符来声明该数据成员,一个常量型的成员函数就可以修改它的值。
#include iostream.h
class AValue
{
int val;
mutable int rptct;
public:
AValue(int v) : val(v), rptct(0) { }
~AValue()
{
cout<<<rptct<< reported was <<val<<> }
void report() const;
};
void AValue::report() const
{
rptct++;
cout << val << endl;
}
int main()
{
const AValue aval(123);
aval.report();
aval.report();
aval.report();
return 0;
}
栏目列表
最新更新
C#基于接口设计三层架构Unity篇
C#线程 入门
C#读取静态类常量属性和值
C# 插件式编程
C# 委托与事件有啥区别?
C#队列学习笔记:队列(Queue)和堆栈(Stack
linq 多表分组左连接查询查询统计
C#队列学习笔记:MSMQ入门一
C# 基础知识系列- 1 数据类型
二、C#入门—基础语法
C# 在Word中添加Latex 数学公式和符号
inncheck命令 – 检查语法
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
SqlServer 利用游标批量更新数据
BOS只读状态修改
SQL Server等待事件—PAGEIOLATCH_EX
数据库多行转换为单一列
获取数据表最后最后访问,修改,更新,
计算经历的时间
SQL查询结果自定义排序
修改数据库默认位置
日期简单加或减
从日期获取年,月或日