类及对象
C++是一种面向对象(OOP)的语言,强调抽象、封装、多态、继承、可重用性等,类(class
)是组成OOP的重要特性。
类的声明
class
关键字声明一个类。
class 类名{
访问控制符://成员
};
成员可以为成员变量、成员函数等。一般地,将类的成员函数称为类的方法。
类似于结构体,在创建类的声明时不会为成员分配内存;仅当对象(类变量)被定义时才会被分配内存。
访问控制标签
访问控制标签限定了外部(位于该类之外)对类成员的可访问性,限定范围为从该标签至下个标签间的所有成员。
public
:成员可被外部访问。private
:默认标签,成员不可被外部访问,仅可被内部方法和友元函数访问。若成员未被指定标签,则其默认为private
。protected
:
C++扩展了结构体,使其大多数功能类似于类。唯一不同之处在于,class
默认标签为private
,struct
默认标签为public
对象的定义
对象是指使用类所定义的实例,定义对象方法类似于定义结构体变量。
类名 变量名;
对象各自有有自己的数据,但共享一组方法。
成员的访问
类似于结构体,使用对象名.成员
进行访问。例:
class temp{
public:int x;void fun(int a,int b){//code}
};
temp t;t.x;//访问变量
t.sum(1,2);//访问方法
方法的实现
-
边声明边定义:
class temp{ public:void fun(int a,int b){//code} };
-
先声明后定义:定义时需使用作用域解析运算符(
::
)以标识函数所属的类,即类名::函数名(形参表)
class temp{ public:void add(int,int); }; void temp::add(int a,int b){//code }
构造函数
专门用于初始化类中成员变量的函数,其与类名同名,没有返回值,且必须被public
标签修饰。
当类无构造函数时,编译器会自动为对象创建空的构造函数。
构造函数可使用默认参数。若定义了构造函数,则在定义对象时必须调用构造函数,为无默认参数的其他形参提供实参。
-
边声明边定义
class temp{int a; public:temp(int x){//code} };
-
先声明后定义
class temp{int a; public:temp(int); }; temp::temp(int x){//code }
-
定义对象:定义对象时必须调用构造函数,为无默认参数的其他形参提供实参。
temp t(10);//隐式调用 temp t=temp(10);//显式调用
析构函数
专门用于销毁成员的函数(如经过动态分配内存得到的成员变量),其名为~类名
,没有返回值,且必须被public
标签修饰。
若成员变量均为块作用域的局部变量,其将被自动销毁释放,无需析构函数。
当类无析构函数时,编译器会自动为对象创建空的析构函数。
-
边声明边定义
class temp{ public:int *a=NULL;temp(){a=new int;}~temp(){delete a;} };
-
先声明后定义
class temp{int *a=NULL;temp();~temp(); }; temp::temp(){a=new int; } temp::~temp(){delete a; }
注意:以上代码仅供构造函数与析构函数的示例,实际上其存在浅拷贝问题。请不要这么使用!