对象的初始化

不能在类声明中对数据成员进行初始化(因为类不是一个实体,是一个抽象类型,不占用存储空间)

Class Time{
public:
int x,y,z;
};
Time t1={1,12,3}

构造函数

成员函数包含构造函数,构造函数的函数名必须和类名一样不然就变成成员函数了
如果用户没有在类中定义构造函数,那么系统会自动生成一个空的的构造函数
注意

  1. 构造函数没有返回值
  2. 构造函数不能调用
  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;
};

构造函数的重载

构造函数的重载和函数重载类似。可以实现创建对象的时候是否赋值,赋值类型,赋值个数,来分别调用不同构造函数。

注意:可以不用参数而调用的构造函数,一个类中只能有一个

无参构造函数:(默认的构造函数),如果不自己写无参构造函数,那么系统会自己生成一个空的无参构造函数。
在生成对象的时候,要调用无参的,只能写出 “类名+对象名;”不能写出"类名+对象名()”

有参构造函数
注意:应在声明构造函数的指定默认值,而不能只在定义构造函数时指定默认值

析构函数

作用:不是删除对象,而是在系统撤销对象占用的内存之前完成一些自定义清理

注意

  1. 一个类可以有多个构造函数,但只能有一个析构函数
  2. 析构函数不能被重载
  3. 和类名同名+“~”符号
  4. 越先构造的对象,就越后被析构
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 类名 对象名【(实参)】

定义成常对象后,该对象的数据成员都变成常数据成员了,而且该对象只能调用它的常成员函数

注意

  1. 常对象只能调用常成员函数
  2. 常成员函数可以访问常对象的数据成员
  3. 常成员函数,不能引用和修改常对象的数据成员

500

常数据成员

结构:const 类型 数据成员名

注意

  1. 将类的某个数据成员声明为常数据成员后,则每个对象而言,该数据成员都是常数

常成员函数

结构:类型 函数名 const

注意

  1. 常成员函数在声明和编写的时候都必须写上 const
  2. 常成员函数不能修改常对象中的数据成员

mutalbe

结构:mutable int x;
可以使用mutalbe 把常对象中的某个数据成员,定义成可变的数据成员

定义常成员函数

void get() const;   //将函数声明成const

对象的赋值

结构:对象2=对象1

注意

  1. 只能赋值数据成员,不能赋值成员函数
  2. 不能动态分配对象,否则会赋值报错

对象的复制

结构:类名 对象2(对象1)
也可以写成 类名 对象1=对象2

注意

  1. 复制调用的是复制构造函数

赋值和复制的区别
赋值是已经存在对象,复制是新建对象

静态数据成员

结构:static 类型 变量名;

静态数据成员是各对象所共用的,不属于某个对象,但是对象可以引用该静态数据成员

注意

  1. 一般数据成员对象建立时分配空间,对象撤销时释放空间,静态数据成员在程序开始时分配空间,整个程序结束后才释放空间
  2. 静态数据成员可以通过类名访问(普通数据成员不能):类名::变量名 必须用 ::

静态成员函数

结构:static 类型 函数名();

静态成员函数是类的一部分,而不是对象的一部分,但是对象也可以调用静态成员函数

注意

  1. 静态成员函数只能引用静态数据成员

友元

结构:friend 类型 函数名(类名 &);

friend 是写在类中,声明类外的普通函数为友元函数, 友元函数可以引用该类中的public数据成员

class Time{
public:
friend void dis(Time &);
};
void dis(Time& t); //注意括号中的值

注意

  1. friend 函数也可以是另一个类中的成员函数(但引用是单项的),注意提前声明
  2. 友元可以访问本类中的私有成员
  3. 不要过多的使用友元

友元类

结构:friend 类名;
把整个类声明为友元

类模板

结构:template<class 虚拟类型名>
要使用模板时,这一行必须写在类声明前面,注意这一行结尾没有 ;

也可以使用多个虚拟类型名
template<class X, class Y ,class Z>

使用了虚拟类型名的类(类模板),在创建对象时,
格式:类模板名 <实际类型名> 对象名