b站黑马程序员C++课程学习笔记
类和对象
C++面向对象的三大特性:封装、继承、多态
C++认为万事万物皆为对象
封装
C++面向对象三大特性之一
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
封装意义一:在设计的时候,属性和新闻给写在一起,表现事物
语法:class 类名{访问权限:属性/行为}
class Student{
public:
string name;
int age;
void showStudent(){
cout << “学生姓名:” << name << ",学生年龄" << age <<endl;
}
}
int main(){
Student stu1;
stu1.name = "zhangsan";
stu1.age = 15;
cout << stu1.showStudent << endl;
}
封装意义二:将属性和行为赋予不同的权限
公共权限 public 成员 类内可以访问 类外可以访问 儿子可以访问父亲中的保护内容
保护权限 protected 成员 类内可以访问 类外不可以访问 儿子可以访问父亲中的保护内容
私有权限 private 成员 类内可以访问 类外不可以访问 儿子不可以访问父亲的私有内容
struct和class的区别
struct默认权限 公共 public
class默认权限 私有 private
成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以监测数据的有效性(检测写入的数据是否有效,若无效,无法改动)
class Person
{
private:
string m_Name; //姓名 可读可写
int m_Age = 18; //年龄 只读
string m_Idol; //偶像 只写
public:
void setName(string name)
{
m_Name = name;
}
string getName()
{
return m_Name;
}
int getAge()
{
return m_Age;
}
void setIdol(string idol)
{
m_idol = idol;
}
}
//可以提供公有的方法对私有属性进行操作,实现可读可写等要求
int main(){
Person p;
p.setName("张三");
cout << “姓名:” << p.getName() << "年龄:" << p.getAge() << endl;
p.setIdol("Kk");
}
对象的初始化清理
构造函数和析构函数
对象的初始化和清理时两个非常重要的安全问题
一个对象或者变量没有初始状态,对其使用后果是未知
同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题
C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作
析构函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作
如果我们不提供构造和析构,编译器会提供
编译器提供的构造函数和析构函数是空实现。
构造函数语法:
没有返回值 不用写void
函数名与类名相同
构造函数可以有参数,可以发生重载
创建对象时,构造函数会自动调用,而且只调用一次
析构函数语法:
没有返回值,不写void
函数名和类名相同,在名称前加~
析构函数不可以有参数,不可以重载
对象销毁前,会自动调用析构函数,而且只会调用一次
class Person
{
public:
Person()
{
cout << "Person构造函数的调用" << endl;
}
~Person()
{
cout << "Person析构函数的调用" << endl;
}
}
void test01()
{
Person p; //在栈上创建类实例
}
int main()
{
test01()
system("pause");
}