【C++】类-基础知识
类-基础知识
1. 语法定义
class class_name{
    public:
    公有成员(对外接口)
    private:
    私有成员(私有接口)
    protected:
    保护性成员
}
- 
成员包含了数据和方法两个部分 
- 
protected与private类似,其差别表现在继承与派生时对派生类的影响不同 
- 
例子(点类) class Point { public: //构造函数 Point(int xx=0, int yy=0) :x(xx), y(yy) { cout << "Calling contruction function of Point..." << endl; } //复制构造函数 Point(Point &p) { cout << "Calling copy construction function of Point.." << endl; x = p.getX(); y = p.getY(); } //类方法 int getX() { return x; } int getY() { return y; } void show() { cout << "(" << x << "," << y << ")" << endl; } private: int x, y; };
2. 类的实现
- 数据成员定义在类内
- 方法可以定义在类内,也可以在类外(类名加作用域限定符,指明这个函数是属于这个类的)
3. 三个基本的函数
3.1 构造函数
功能
用于在创建类时给类设定初值
形式
- 函数名就是类名
- 没有返回值类型和return语句
- 可以有形参,也可以没有形参
- 可以是内联函数
- 可以重载(可以定义多个构造函数,符合语法即可)
- 可以带默认参数,如果所有的参数都带默认参数,该构造函数就是默认构造函数
Note:在声明中定义了默认参数时,实现中不能再指定默认参数。下面代码运行会报错
void func(int x = 0);
void func(int x = 0){
    cout << x << endl;
}
调用时机
- 按照构造函数形式初始化类
- 类之间的相互赋值=(不是复制构造函数)
默认构造函数
- 
未定义构造函数时,编译器默认不生成构造函数,如果需要,则指定为 class_name()=default
- 
默认构造函数的函数列表为空 
- 
类内定义了数据的初始值时,用初始值初始化,否则以默认方式初始化 
- 
基本数据类型的初始化值不确定! 
3.2 复制构造函数
功能
用一个已经初始化好的对象去初始化本类的一个新对象,形参为已知对象的引用(因为复制构造函数还未定义,无法通过复制的方式传递参数)
形式
class 类名 {
public :
    类名( 形参);//构造函数
    类名( const 类名 &对象名);//复制构造函数
    // ...
};
- 未定义复制构造函数时,编译器会生成默认的复制构造函数
- 不让编译器生成默认构造函数需要用=delete指定
调用时机
- 函数参数传递
- 函数返回值
- 以本类的一个对象作为初始值定义新的对象
3.3 析构函数
- 完成对象被删除前的一些清理工作。
- 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
- 如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。
- 声明为~class_name()
4. 类组合
概念
一个类中的成员是另一个对象。比如线段类包含了点类:
class Line
{
//public:
//	Line(Point pp1, Point pp2);
//	Line(Line &l);
//	double get_len() { return len; }
private:
	Point p1, p2;
	double len;
};
设计
- 
要同时对本类基本成员和对象成员初始化 
- 
声明: 类名::类名(对象成员所需的形参,本类成员形参):对象1(参数),对象2(参数), ...... { //函数体其他语句 }Note:冒号后面的部分实际上是在调用复制构造函数。也可以将该部分省略,放到函数体内用 =赋值
实例:线段类
// 点类
class Point
{
public:
	Point(int xx=0, int yy=0) :x(xx), y(yy) {
		cout << "Calling contruction function of Point..." << endl;
	}
	Point(Point &p) {
		cout << "Calling copy construction function of Point.." << endl;
		x = p.getX();
		y = p.getY();
	}
	int getX() { return x; }
	int getY() { return y; }
	void show() {
		cout << "(" << x << "," << y << ")" << endl;
	}
private:
	int x, y;
};
//线段类
class Line
{
public:
	Line(Point pp1, Point pp2);
	Line(Line &l);
	double get_len() { return len; }
private:
	Point p1, p2;
	double len;
};
Line::Line(Point pp1, Point pp2)
: p1(pp1), p2(pp2){
	cout << "Calling constuction function of Line..." << endl;
	double x = pp1.getX() - pp2.getX();
	double y = pp1.getY() - pp2.getY();
	len = sqrt(x * x + y * y);
}
Line::Line(Line &l){
	p1 = l.p1;
	p2 = l.p2;
	len = l.get_len();
}
作者:Vinson
-------------------------------------------
个性签名:只要想起一生中后悔的事,梅花便落满了南山
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号