结构体默认情况下是共有的,类的成员在默认情况下是私有的
类
包括数据成员和成员函数
数据成员可以是任何的数据类型,但是不能用extern(外部型,不是在当前程序段分配内存),auto(自动型,不声明就是),register(寄存器型)指定它的存储类型,可以是static类型
不能在类的声明中给数据成员赋初值
class abc
{
private:
char a = ‘a’; //错 定义类的时候只是在定义数据类型
};
成员函数要在类体内声明,还要在类外定义,成员函数在类内部定义就是内联函数
class point
{
private:
int x, y;
public:
void setpoint(int,int);
int getX() {return x;} //内联函数第一种表示
inline int getY(); //内联函数第二种表示
};
void point::setpoint(int a, int b)
{
x = a;
y = b;
}
inline int point::getY()
{
return y;
}
类外定义函数名前加 类名::
成员函数若有参数要有完整的参数说明
成员函数的返回类型应与函数原型声明的相同
对象
是类的一个实例
同类的多个对象占据内存的不同区域,每个对象保存的数据不同,但是用来操作数据的程序代码是一样的,即使用相同的成员函数
创建对象
class point
{
int x,y;
}op1,op2; //op1,op2是全局变量
main ()
{
point op3; //op3是局部变量
}
对象赋值
两个对象赋值时,类型必须相同,两个对象分别占用不同的存储空间,若类的成员是指针类型,可能出错
使用同名对象时应加作用域运算符”::”
构造函数
构造函数与类名相同,是共有函数,不能指定返回类型,void也不行,不能显示调用
静态对象,只构造一次
全局对象,在执行main()之前调用
外部对象,程序并不为它调用构造函数
构造函数可以重载
为类定义了带参数构造函数时c++编译器不产生缺省构造函数
可以采用构造初始化表对数据成员进行初始化c++编译器也不产生缺省构造函数
拷贝构造函数
类型 (const 类名 &对象名);
类名::类名 (const 类名 &对象名){..//函数体} //没有反值(构造函数没反值)
拷贝构造函数
如果没有定义拷贝构造函数,系统就会产生一个缺省的拷贝构造函数
如果所定义的类的数据成员是普通的变量(不是指针,不是数组),没必要写拷贝构造函数。如果有指针或者数组,如果构造函数中存在需要动态分配内存的数据成员,必须定义拷贝构造函数,不然会出错
调用拷贝构造函数的地方
新建对象
point p2(p1);
函数的形参是个对象,那么传递的时候体统就会调用实参的拷贝构造函数
void f(A a){...}
void main()
{
A a;
f(a);
}
如果函数的反值是个对象,这里也会调用拷贝构造
A fn(A &a){...return a;}
void main()
{
f(fn());
}
对象赋值的时候也会调用拷贝构造函数
point p1(10,20);
point p2=p1; //等价于point p2(p1);
数据类型转换
int num; //Example try(num);
float x, float y; //point p (x,y);
char A[]=”Hello”; //String s(A);
析构函数
在类定义体中,与类同名,并在前面冠以”~”的成员函数
释放对象在构造时分配的资源
关闭被构造函数打开的文件
释放动态内存
对象的生命周期结束时,由体统自动调用
调用顺序与构造函数相反
析构函数没有返回类型,没参数,析构函数不能重载
数据成员是指针来代替数组,一开始不知道数组需要开多大的空间
等具体的时候再决定指针的数组需要多的内存空间,这样就不浪费
class string_data{
char *str;
public:
string_data(char*s)
{
str = new char[strlen(s)+1];
strcpy(str,s);
}
~string_data()
{delete []str;}
void get_info(char &);
void sent_info(char *char);
}