对象的初始化
不能在类声明中对数据成员进行初始化(因为类不是一个实体,是一个抽象类型,不占用存储空间)
Class Time{
public:
int x,y,z;
};
Time t1={1,12,3}
构造函数
成员函数包含构造函数,构造函数的函数名必须和类名一样不然就变成成员函数了
如果用户没有在类中定义构造函数,那么系统会自动生成一个空的的构造函数
注意:
- 构造函数没有返回值
- 构造函数不能调用
- 构造函数是在对象创建之前系统自动调用的
构造函数实现初始化
使用构造函数给成员变量的赋值初始化数据。
class Time{
public:
Time(){
hour=0;
}
private:
int hour;
};
带参数的构造函数实现初始化
普通形式
class Time{
public:
Time(int x){
hour=x; //不再限定值,类外给什么就是什么
}
private:
int hour;
};
带成员构造表形式(推荐)
class Time{
public:
Time(int x):hour(x){
}
private:
int hour;
};
构造函数的重载
构造函数的重载和函数重载类似。可以实现创建对象的时候是否赋值,赋值类型,赋值个数,来分别调用不同构造函数。
注意:可以不用参数而调用的构造函数,一个类中只能有一个
无参构造函数:(默认的构造函数),如果不自己写无参构造函数,那么系统会自己生成一个空的无参构造函数。
在生成对象的时候,要调用无参的,只能写出 “类名+对象名;”不能写出"类名+对象名()”
有参构造函数:
注意:应在声明构造函数的指定默认值,而不能只在定义构造函数时指定默认值
析构函数
作用:不是删除对象,而是在系统撤销对象占用的内存之前完成一些自定义清理
注意:
- 一个类可以有多个构造函数,但只能有一个析构函数
- 析构函数不能被重载
- 和类名同名+“~”符号
- 越先构造的对象,就越后被析构
class Time{
public:
Time(int x){
hour=x; //不再限定值,类外给什么就是什么
}
~Time(){ //析构函数
}
private:
int hour;
};
对象数组
结构:类名 + 对象名[] = {x,y,z}
如果构造函数有多个参数,如果单独赋值
class T:
{
};
T s[3]={
box(12,13,14),
box(121,124,124),
box(123,513,12),
}
对象指针
指向对象的指针
结构:类名 星号 对象指针名
*pt
(*pt).hour //和 pt->hour 一样
指向对象成员的指针
结构:数据类型名 星号 指针变量名
this指针
每个成员函数中都包含一个特殊的指针,就是this指针
指向本类对象的指针,它的值是当前被调用的成员函数所在对象的起始地址。
//对象a
this->width; //和 a.width 效果一样
this是隐形的
//类名:Box
//编写的时候
int Box::a()
{
return(width);
}
//实际情况
int Box::a(box * this)
{
return(this->width);
}
共用数据的保护
常对象
结构:类名 const 对象名【(实参)】 或者 const 类名 对象名【(实参)】
定义成常对象后,该对象的数据成员都变成常数据成员了,而且该对象只能调用它的常成员函数
注意
- 常对象只能调用常成员函数
- 常成员函数可以访问常对象的数据成员
- 非常成员函数,不能引用和修改常对象的数据成员
常数据成员
结构:const 类型 数据成员名
注意
- 将类的某个数据成员声明为常数据成员后,则每个对象而言,该数据成员都是常数
常成员函数
结构:类型 函数名 const
注意
- 常成员函数在声明和编写的时候都必须写上 const
- 常成员函数不能修改常对象中的数据成员
mutalbe
结构:mutable int x;
可以使用mutalbe 把常对象中的某个数据成员,定义成可变的数据成员
定义常成员函数
void get() const; //将函数声明成const
对象的赋值
结构:对象2=对象1
注意
- 只能赋值数据成员,不能赋值成员函数
- 不能动态分配对象,否则会赋值报错
对象的复制
结构:类名 对象2(对象1)
也可以写成 类名 对象1=对象2
注意
- 复制调用的是复制构造函数
赋值和复制的区别:
赋值是已经存在对象,复制是新建对象
静态数据成员
结构:static 类型 变量名;
静态数据成员是各对象所共用的,不属于某个对象,但是对象可以引用该静态数据成员
注意
- 一般数据成员对象建立时分配空间,对象撤销时释放空间,静态数据成员在程序开始时分配空间,整个程序结束后才释放空间
- 静态数据成员可以通过类名访问(普通数据成员不能):类名::变量名 必须用 ::
静态成员函数
结构:static 类型 函数名();
静态成员函数是类的一部分,而不是对象的一部分,但是对象也可以调用静态成员函数
注意
- 静态成员函数只能引用静态数据成员
友元
结构:friend 类型 函数名(类名 &);
friend 是写在类中,声明类外的普通函数为友元函数, 友元函数可以引用该类中的public数据成员
class Time{
public:
friend void dis(Time &);
};
void dis(Time& t); //注意括号中的值
注意
- friend 函数也可以是另一个类中的成员函数(但引用是单项的),注意提前声明
- 友元可以访问本类中的私有成员
- 不要过多的使用友元
友元类
结构:friend 类名;
把整个类声明为友元
类模板
结构:template<class 虚拟类型名>
要使用模板时,这一行必须写在类声明前面,注意这一行结尾没有 ;
也可以使用多个虚拟类型名
template<class X, class Y ,class Z>
使用了虚拟类型名的类(类模板),在创建对象时,
格式:类模板名 <实际类型名> 对象名