类
类构成了实现C++面向对象程序设计的基础,类用来定义对象的行为和属性,类是C++封装的基本单元。
1、类的定义
使用 class
定义一个类一般形式如下:
class 类名
{
public:
<共有数据和函数>
protected:
<保护数据和函数>
private:
<私有数据和函数>
};
数据成员用来描述对象的属性,允许是任何数据类型。类中的数据成员在声名时不允许初始化。
成员函数用来描述对象的行为,与普通函数一样,可以重载,可以使用默认参数,也可以声名为内联函数。
类成员的访问限制
如果不指定,默认为私有成员。
public :共有成员
protected: 保护成员,
能通过派生类对象在成员函数中访问,
还可以在派生类成员函数中通过派生类访问其基类的protected 成员
private:私有成员
成员函数的实现
- 成员函数的实现可以在类内,也可以类外。类内一定要有函数原型说明。
- 类内定义的函数默认内联函数
一般形式
<返回类型> <类名>::<函数名>(参数)
{
函数体
}
//定义一个点类。
#include <iostream>
using namespace std;
class Point
{
public:
void setxy(int x,int y);
void displayxy();
private:
int _x;
int _y;
};
void Point::setxy(int x,int y)
{
_x = x;
_y = y;
}
void Point::displayxy()
{
cout<<_x<<","<<_y<<endl;
}
int main()
{
Point p1;
p1.setxy(3, 4);
p1.displayxy();
return 0;
}
对象的创建和销毁
创建对象时,对象称为类的实例(instance)。为对象分配存储空间主要有静态分配和动态分配两种方式。堆对象采用动态分配,需要手动销毁。(new和delete)静态分配方式,对象的销毁由程序决定。
构造函数和析构函数
c++ 程序中的初始化和清理工作。分别由两个特殊的函数来完成,他们就是构造函数和析构函数
构造函数
1. 构造函数的特点:
- 函数名与类名相同。
- 可以重载
- 不能指定返回类型。
- 不能被显示调用,在创建对象时被自动调用。
2. 默认构造函数
默认构造函数就是无参构造函数,可以自己定义,也可以是编译系统自动生成。当没有为一个类定义任何构造函数的情况下,编译系统会自动生成一个默认构造函数。
析构函数
1. 析构函数的特点:
- 对象消息前执行清理工作。
- 函数名与类名相同,需要加
~
。 - 不可以重载,没有参数。
- 不能指定返回类型。
- 在释放对象时被自动调用。
2. 默认析构函数
当没有为一个类定义析构函数的情况下,编译系统会自动生成一个默认析构函数。
构造函数的调用顺序与声名对象的顺序一致,析构函数相反。
拷贝构造函数
拷贝构造函数是一种特殊的构造函数,他的作用是用一个已经存在的对象去初始化另一个对象,为了保证所引用的对象不被修改,通常把引用的参数声明为const 参数。
格式如下:
<类名>::<l类名>(const <类名>&对象名)
{
...
}
特点:
- 拷贝构造函数名与类名相同,不能指定返回类型
- 只有一个参数,并且该参数是该类的对象引用
- 不能被显示调用。
- 如果一个类没有定义拷贝构造函数,则系统自动生成默认拷贝构造函数,功能是将已知对象的所有数据成员的值拷贝给对应对象的数据成员。
自动调用的情形 - 当用一个类的对象去初始化该类的另一个对象。
- 当函数形参是类的对象,进行形参和实参结合时。
- 当函数的返回值是类的对象,函数执行完成返回调用者时。
深拷贝与浅拷贝
浅拷贝
又称值拷贝,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的。
深拷贝
拷贝的时候先开辟出和源对象大小一样的空间,然后将源对象里的内容拷贝到目标对象中去,这样两个指针就指向了不同的内存位置。并且里面的内容是一样的。两个指针先后去调用析构函数,分别释放自己所指向的位置。即为每次增加一个指针,便申请一块新的内存,并让这个指针指向新的内存,深拷贝情况下,不会出现重复释放同一块内存的错误