C++入门基础教程(四):类和对象(上)

前言

博主通过对C++基础知识的总结,有望写出深入浅出的C++基础教程专栏,并分享给大家阅读,今后的一段时间我将持续更新C++入门系列博文,想学习C++的朋友可以关注我,希望大家有所收获。

C++面向对象的三大特性为:封装、继承、多态

1 封装

1.1 基本概述

类的语法:class 类名{ 访问权限:属性/行为 };

实例化: 通过一个类,创建一个对象的过程。

// 封装案例
class student
{
public:
	// 属性
	string m_Name;  // 姓名
	int m_ID;      // 学号

	
	// 行为
	void showstudent()
	{
		cout << "姓名:" << m_Name << "  学号:" << m_ID << endl;
	}

};

// 创建具体的学生,实例化对象
student s1;
// 给s1对象进行属性赋值操作
s1.m_Name = "张三";
s1.m_ID = 1;

类中的属性和行为统称为成员。属性:成员属性或成员变量;行为:成员函数或成员方法。

封装意义:1)在设计类的时候属性和行为写在一起,表现事物;2)在设计类的时候可以把属性和行为放在不同的权限下,加以控制。

1.2 访问权限

访问权限有三种:

1)public 公共权限:成员类内可以访问,类外也可以访问;

2)protected 保护权限:成员类内可以访问,类外不可以访问;

3)private 私有权限:成员类内可以访问,类外不可以访问。

struct和class的区别:默认的访问权限不同struct 默认为公共权限;class 默认为私有权限。

2 对象特性

2.1 对象的初始化和清理

构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用。

析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

class Person
{
	// 1、构造函数:进行初始化操作
	// 没有返回值,不用写void
	// 函数名与类名相同
	// 可以有参数,可以发生重载
	// 创建对象的时候会自动调用,且仅调用一次
public:
	Person()
	{
		cout << "Person构造函数的调用" << endl;
	}
	// 2.析构函数:进行清理的操作
	// 没有返回值,不用写void
	// 函数名与类名相同,在名称前加~
	// 不可以有参数,不可以发生重载
	// 对象在销毁前会自动调用,且仅调用一次
	~Person()
	{
		cout << "Person析构函数的调用" << endl;
	}
};

// 创建一个对象p
Person p;

2.2 构造函数的分类及调用

分类:按照参数分类(无参、有参);按照类型分类(普通构造、拷贝构造)。

class Person
{
public:
	Person()
	{
		cout << "Person默认(无参)构造函数的调用" << endl;
	}
	Person(int age)
	{
		cout << "Person有参构造函数的调用" << endl;
		m_Age = age;
	}
	Person(const Person &p)
	{
		cout << "Person拷贝构造函数的调用" << endl;
		m_Age = p.m_Age;
	}
	~Person()
	{
		cout << "Person析构函数的调用" << endl;
	}

	int m_Age;

};

调用:括号法、显示法、隐式转换法。

// 调用默认(无参)构造函数
void test01()
{
	Person p;
}

// 调用有参构造函数
void test02()
{
	// 括号法,常用
	Person p1(10);

	// 显示法
	Person p2 = Person(10);
	Person p3 = Person(p2);

	// 隐式转换法
	Person p4 = 10;  // 等价于Person p4 = Person(10);
	Person p5 = p4;  // 等价于Person p5 = Person(p4);
}

2.3 拷贝构造函数的调用时机

#include 
using namespace std;

class Person
{
public:
	Person()
	{
		cout << "Person默认构造函数的调用" << endl;
	}
	Person(int age)
	{
		cout << "Person有参构造函数的调用" << endl;
		m_Age = age;
	}
	Person(const Person &p)
	{
		cout << "Person拷贝构造函数的调用" << endl;
		m_Age = p.m_Age;
	}
	~Person()
	{
		cout << "Person析构函数的调用" << endl;
	}

	int m_Age;

};

// 1)使用一个已经创建完毕的对象来初始化一个新对象
void test01()
{
	Person p1(20);
	Person p2(p1);

	cout << "p2的年龄为:" << p2.m_Age << endl;
}

// 2)值传递的方式给函数参数传值
void dowork1(Person p)
{

}
void test02()
{
	Person p;
	dowork1(p);
}

// 3)值方式返回局部对象
Person dowork2()
{
	Person p1;
	return p1;
}
void test03()
{
	Person p = dowork2();
}

int main()
{
	test01();
	test02();
	test03();
	system("pause");
	return 0;
}

2.4 构造函数调用规则

1)创建一个类,C++编译器会给每个类都添加至少3个函数:默认构造函数(空实现)、析构函数(空实现)、拷贝函数(值拷贝);

2)如果写了有参构造函数,编译器就不再提供默认构造函数,但依然会提供拷贝构造函数;

3)如果写了拷贝构造函数,编译器就不再提供普通构造函数。

 

未完待续,敬请期待下一篇博客:C++入门基础教程(五):类和对象(中)

结束语

大家的点赞和关注是博主最大的动力,博主所有博文中的代码文件都可分享给您(除了少量付费资源),如果您想要获取博文中的完整代码文件,可通过C币或积分下载,没有C币或积分的朋友可在关注、点赞和评论博文后,私信发送您的邮箱,我会在第一时间发送给您。博主后面会有更多的分享,敬请关注哦!

 

 

你可能感兴趣的:(C++基础教程,新星计划,c++,编程语言)