C++程序设计【三】之 类和对象进阶

感谢内容提供者:金牛区吴迪软件开发工作室
接上一篇:C++程序设计【二】之面向对象的基本概念

第三章:类和对象进阶

一、构造函数

1.构造函数的作用

在这里插入图片描述
在这里插入图片描述

2.构造函数的定义

在这里插入图片描述
在这里插入图片描述

3.构造函数的使用

在这里插入图片描述
在这里插入图片描述

4.复制构造函数与类型转换构造函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、析构函数

在这里插入图片描述
在这里插入图片描述
示例:

使用delete语句
现在修改类 myDate 和类 Student 的无参构造函数和析构函数如下:

myDate::myDate(): year(1970), month(1), day(10) {
	cout << "myDate 构造函数" << endl;
}
myDate::~myDate() {
	cout << "myDate 析构函数" << endl;
}
Student::Student(): name("Noname"), birthday(myDate()) {
	cout << "Student 构造函数" << endl;
}
Student::~Student() {
	cout << "Student 析构函数" << endl;
}

如果在主函数中执行以下语句:

Student *stud = new Student();
delete stud;

则得到信息如下:
myDate 构造函数
Student 构造函数
Student 析构函数
myDate 析构函数

在这里插入图片描述

三、类的静态成员

1.静态变量

在这里插入图片描述

2.类的静态成员

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
static int glos = 100;
void f() {
	int a = 1; // 局部自动变量a
	static int fs = 1;	// 静态局部变量fs,完成初始化。
	cout << "在f中:a(自动)=" << a << "    fs(静态)=" << fs << "   glos(静态)=" << glos << endl;
	a += 2;
	fs += 2;
	glos += 10;
	cout << "在f中:a(自动)=" << a << "    fs(静态)=" << fs << "   glos(静态)=" << glos << endl;
	// cout << "ms= " << ms << endl;	// 改行错误,变量ms不可见。
}
int main() {
	static int ms = 10;
	for (int i = 1; i <= 3; i++) {
		f();
	}
	// cout << "fs = " << fs << endl;	该行报错,变量fs不可见。
	cout << "ms=" << ms << endl;
	cout << "glos=" << glos << endl;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

四、变量及对象的生存期和作用域

1.变量的生存期和作用域

在这里插入图片描述

2.类对象的生存期和作用域

在这里插入图片描述

五、变量成员和常引用成员

1.常量成员和常引用成员

在这里插入图片描述

六、成员对象和封闭类

在这里插入图片描述

1.封闭类构造函数的初始化列表

在这里插入图片描述

2.封闭类的复制构造函数

在这里插入图片描述

七、友元

1.友元

在这里插入图片描述

#include <iostream>
#include <cmath>

using namespace std;
class Pixel; // 前向引用声明
class Text {
	public:
		void printX(Pixel p);	// 用到了类Pixel
};

class Pixel {
	private:
		int x, y;
	public:
		Pixel(int x0, int y0) {
			x = x0;
			y = y0;
		}
		void printxy() {
			cout << "pixel:(" << x << "," << y << ")" << endl;
		}
		friend double getDist(Pixel p1, Pixel p2);
		friend void Test::printX(Pixel p);
};

void Test::printX(Pixel p) {
	cout << "x=" << p.x << " y=" << p.y << endl;	// 访问类Pixel的私有成员
	return;
}
double getDist(Pixel p1, Pixel p2) {	// 友元函数在类体外定义
	double xd = double(p1.x - p2.x);	// 使用类Pixel的私有成员x
	double yd = double(p1.y - p2.y);	// 使用类Pixel的私有成员y
	return sqrt(xd * xd + yd * yd);	// 俩点间距离
}

int main() {
	Pixel p1(0, 0), p2(10, 10);
	p1.printxy();
	p2.printxy();
	cout << "(p1, p2)间距离=" << getDist(p1, p2) << endl;
	Test t;
	cout << "从友元函数中输出--" << endl;
	t.printX(p1);	// 通过对象调用类的成员函数
	t.printX(p2);	// 通过对象调用类的成员函数
	return 0;
}

2.友元函数

在这里插入图片描述

3.友元类

在这里插入图片描述

八、this指针

在这里插入图片描述

class myDate {
	public:
		myDate();
		myDate(int, int, int);
	private:
		int year, month, day;
};
myDate::myDate() {
	year = 1970;
	month = 1;
	day = 1;
}
// 加参数的例一
myDate::myDate(int y, int m, int d) {
	year = y;
	month = m;
	day = d;
}
// 其实加参数的例一可以写成下面这样,只不过简写了而已
myDate::myDate(int year, int month, int day) {
	this -> year = year;
	this -> month = month;
	this -> day = day;
}

下一篇:C++程序设计【四】之运算符重载的概念

吴迪软件开发 小程序 ECMAScript 6 React.js
金牛区吴迪软件开发工作室博客
已标记关键词 清除标记
相关推荐