前言:更多内容请看总纲《嵌入式C/C++学习路》
1. 什么是面向对象?
- 万物皆对象,这是人类面对世界最朴素,最自然的感觉、想法和观点
- 把大型软件看成是一个由对象组成的社会
- 对象拥有足够的智能,能够理解来自其他对象的信息,并以适当的行为作出反应
- 对象能够从高层对象继承属性和行为,并允许低层对象从自己继承属性和行为等
- 编写程序的过程就是描述对象属性和行为的过程,凭借这种能力使问题域和解域获得最大程度的统一
- 面向对象的三大要件:封装、继承和多态
2. 怎样面向对象?
- 至少掌握一种面向对象的程序设计语言,如C++
- 深入理解封装、继承和多态等面向对象的重要概念
- 精通一种元语言,如UML,在概念层次上描述设计。UML类图如下所示
- 学习设计模式,源自多年成功经验的积累和总结

3. 类和对象
- 拥有相同属性和行为的对象被分成一组,即一个类
- 类可用于表达那些不能直接与内置类型建立自然映射关系的逻辑抽象
- 类是一种用户自定义的复合数据类型,即包括表达属性的成员变量,也包括表达行为的成员函数
- 类是显示世界的抽象,对象是类在虚拟世界的实例

类的定义与实例化
类的一般形式

访问控制限定符
- 在C++中,类和结构已经没有本质型的差别,唯一的不同在于:类class的缺省访问控制属性为私有,结构struct的缺省访问控制属性为公有。
- 访问控制限定符仅作用于类,而非作用于对象,因此同一个类的不同对象,可以互相访问非公有部分
- 对不同成员的访问控制属性加以区分,体现了C++作为面向对象程序设计语言的封装特性

举个简单的例子,假如基类是我,子类是我的老婆儿子,外部是我的同事:
- 公有成员是我的名字,不管是我的家人还是同事朋友都知道
- 保护成员是我的小名,只有我和老婆儿子知道,同事不知道
- 私有成员是我的私房钱,只有我自己知道,老婆儿子同事都不知道
下面通过一段代码学习一下:
#include <iostream>
using namespace std;
class Student // 创建学生类
{
public: // 公有成员访问控制符
void who(void) // 行为 成员函数
{
cout << "我是" << m_name << ",今年" << m_age << "岁." << endl;
}
void learn(const string &course) // 用引用是为了防止复制的开销,加const是为了防止意外的修改
{
cout << "我在学习" << course << "课程。" << endl;
}
string m_name; // 成员变量
int m_age;
};
// 把学生类变成对象(实例化)
int main(void)
{
Student s1 = {"张三", 22}; // 初始化对象
s1.who(); // 调用成员函数
s1.learn("C++");
s1.m_name = "二货"; // 用户可以随意修改公有成员变量
s1.m_age = -100;
s1.who(); // 调用成员函数
}
从输出可以看到,用户可以随意修改公有成员变量,所以出现了私有成员,将名字和年龄放入私有成员以后,再次编译代码将会报错:
#include <iostream>
using namespace std;
class Student // 创建学生类
{
public: // 公有成员访问控制符
void who(void) // 行为 成员函数
{
cout << "我是" << m_name << ",今年" << m_age << "岁." << endl;
}
void learn(const string &course) // 用引用是为了防止复制的开销,加const是为了防止意外的修改
{
cout << "我在学习" << course << "课程。" << endl;
}
private: // 私有成员控制访问符
string m_name; // 成员变量
int m_age;
};
// 把学生类变成对象(实例化)
int main(void)
{
Student s1 = {"张三", 22}; // 初始化对象
s1.who(); // 调用成员函数
s1.learn("C++");
s1.m_name = "二货"; // 用户可以随意修改公有成员变量
s1.m_age = -100;
s1.who(); // 调用成员函数
}
将名字放入私有成员后,用户该怎么给学生对象命名呢?可以在公有成员里面创建一个函数,当学生姓名/年龄满足一定条件的时候,才创建学生对象。因为类的内部可以访问私有成员变量。
例子如下:假如用户给学生命名为”二货“或者年龄 <=0 的时候,拒绝创建。
#include <iostream>
using namespace std;
class Student // 创建学生类
{
public: // 公有成员访问控制符
void who(void) // 行为 成员函数
{
cout << "我是" << m_name << ",今年" << m_age << "岁." << endl;
}
void learn(const string &course) // 用引用是为了防止复制的开销,加const是为了防止意外的修改
{
cout << "我在学习" << course << "课程。" << endl;
}
void setName(const string& name){
if(name == "二货"){
cout << "你才是二货!!!" << endl;
return ;
}
m_name = name;
}
void setAge(int age){
if(age <= 0){
cout << "非法年龄!" << endl;
return ;
}
m_age = age;
}
private:
string m_name; // 成员变量
int m_age;
};
// 把学生类变成对象(实例化)
int main(void)
{
Student s1; // 初始化对象
s1.setName("二货");
s1.setAge(-50);
s1.who(); // 调用成员函数
s1.setName("张飞");
s1.setAge(22);
s1.who(); // 调用成员函数
}
可以看到输入的名字和年龄不满足条件时,s1就是我们初次定义的对象即Student s1;,这里名字是字符串‘\0’,age是随机的数字(这里其实跟代码有关,我们没有对s1进行初始化赋值,因为名字和年龄变成私有变量后,不能通过等号的方式赋值,初始化的方式后面会讲)。下面重新定义合理的名字和年龄后,创建对象成功。
构造函数
- 函数名与类名相同,且没有返回类型
- 在创建对象时自动被调用,且仅被调用一次
- ——对象定义语句
- ——new操作符
- 为成员变量赋初值,分配资源,设置对象的初始状态
- 对象的创建过程
- ——为整个对象分配内存空间
- ——以构造实参调用构造函数->构造基类部分->构造成员变量->执行构造代码
版权声明
本文为[Goafan]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_45231460/article/details/124764003