对象和类
基本概念和语法
根据面向对象的定义,类是一系列数据和针对这些数据的操作的集合。由于C++对结构体进行了扩展,所以在功能上类跟结构体的作用完全一致。但是在实际的使用上,结构体只用来封装数,而类用来表示一个对象的模板。
类的声明中分为两个部分,私有
和公有
,两个部分声明的成员有相应的可访问性。
类的声明跟定义分开,如果在声明类的同时定了函数,该函数就会被编译成内联函数。并且在开发的时候一般将类的定义写在头文件中,对应类的定义写在一个单独的代码源文件中,编译的时候将多个文件进行编译即可。
在类中定义的函数都具有类访问域,也就是说不需要作用域解析符::
也可以访问类中的变量,并且类中定义的所有方法都可以访问私有变量。
class Stock{
private:
double price;
public:
//在声明类的时候定义的函数,会变成内联函数
void show() const{
//可以直接访问类中的私有变量
cout << "Stock price is: " << price << endl;
};
};
声明类的时候有三种方法:
Stock x = Stock(23); //显式调用构造函数
Stock y(23); //隐式调用构造函数
Stock z{23}; //用列表参数调用构造函数
构造函数
用于初始化类,可以通过对构造函数的重载实现不同形式的类初始化形式。需要注意的是,构造函数的名字跟类的名字相同,并且没有返回类型。
在没有为类定义构造函数的情况下,编译器会为类定义一个不接受参数的构造函数,这种不接受参数的构造函数称为默认构造函数
。如果定义了其他形式的构造函数,编译器就不会自动添加默认构造函数,这时需要手动提供默认构造函数。例如对上述Stock
类添加构造函数:
class Stock{
private:
double price;
public:
Stock(double);
Stock(); //创建了构造函数,必须手动创建默认构造函数
void show() const;
void changePrice(double);
};
析构函数
在销毁对象的时候调用,用于处理销毁类时的一些必要操作,通常用于与对象中用new
申请的动态内存。其语法跟构造函数差不多,也没有返回类型, 不一样的是析构函数没有参数列表,并且函数名是在构造函数前面加上~
。例如:
~Stock();
调用析构函数的时机有编译器决定。如果创建的是静态存储类对象,则在程序执行结束时被调用。如果对象是用new
申请的动态内存,则在使用delete
摧毁对象的时候调用析构函数。最后,程序可以创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象的使用时调用其析构函数。
const
成员函数
当我们申请一个const
对象之后,之后对该对象的操作都不能改变其成员的值。但是我们不能确定哪些函数会改变类成员的值而哪些函数不会。这个时候我们需要把const
关键字加在函数签名的后面,表示该函数不会修改类成员的值。对于一个const
对象,不能调用它的非const函数
。例如:
const Stock s = Stock(23);
s.show(); //合法,show()为conse函数
s.changePrice(); //非法,changePrice()不是const函数