类与面向对象
-
struct和class
(1)struct是C中用户自定义类型,主要功能是对功能相关数据的封装
(2)struct不能直接封装函数,但可以通过封装函数指针来间接封装函数
(3)struct就是class的初级阶段,class在struct基础上做了很多扩展,便有了面向对象 -
访问权限
(1)类是对数据(成员变量)和方法(成员函数)的封装
(2)封装的一个重要特征就是访问权限管控,本质是为了隐藏实现细节,避免意外篡改
(3)C++支持三个访问管控级别:private、protected、public -
C++的对象创建和销毁
(1)对象的本质等同于C中的变量,对象的创建和销毁也就是变量的产生和销毁,本质上是变量对应的内存地址的分配和释放归还
(2)C中全局变量和局部变量都是自动分配和回收内存的,堆内存需要用户手工申请和释放(malloc和free调用)
(3)C++中因为变量升级成了对象,设计到构造函数和析构函数,因此malloc和free升级为了new和delete
(4)C++中仍然大量使用全局变量和局部变量,但是动态分配占比例越来越多。这是业务特点决定的,不是C++语言决定的。语言只是提供机制,业务才决定策略。
#include <iostream>
// 定义一个 struct
struct Person {
// 默认是 public 的
std::string name;
int age;
void introduce() {
std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl;
}
};
int main() {
// 创建一个 Person 对象
Person person;
person.name = "Alice";
person.age = 30;
person.introduce();
return 0;
}
#include <iostream>
// 定义一个 class
class Person {
// 默认是 private 的
std::string name;
int age;
public:
// 构造函数
Person(std::string n, int a) : name(n), age(a) {}
void introduce() {
std::cout << "Hi, I'm " << name << " and I'm " << age << " years old." << std::endl;
}
// 设置和获取名称的方法
void setName(std::string n) {
name = n;
}
std::string getName() const {
return name;
}
// 设置和获取年龄的方法
void setAge(int a) {
age = a;
}
int getAge() const {
return age;
}
};
int main() {
// 创建一个 Person 对象
Person person("Bob", 25);
person.introduce();
// 修改名称和年龄
person.setName("Charlie");
person.setAge(28);
person.introduce();
return 0;
}
static和this关键字
- static在C中的用法
(1)静态全局变量和函数,限制链接属性。C++中建议优先使用命名空间机制替代
(2)静态局部变量,更改地址域和生命周期。C++中继续沿用。 - static在C++中新增用法
(1)用在class中,有静态数据成员和静态成员函数
(2)简单理解:静态成员和方法是属于class的,而非静态是属于对象的
(3)静态类往往用在单例模式中,实际上和面向对象的思想有所差异
(4)要真正理解静态类,得先学习面向对象和普通非静态类后才可以 - this关键字
(1)本质是个指针,指向当前对象
(2)this的主要作用是让我们在未定义对象前可以在方法中调用对象里的成员
(3)this的深度讲解在第2部分,包括具体使用和实现原理
面向对象的其他关键字
-
面向对象允许类的继承机制
(1)C++中用:来表示继承关系,有些编程语言有extends关键字表示继承关系
(2)virtual修饰class的成员函数为虚函数,一般在基类中,只有接口声明没有实体定义
(3)基类的virtual成员可以在派生类中override重写,以实现面向对象的多态特性
(4)注意区分重写override与重载overload
(5)override关键字是C++11引入,用来在派生类中成员函数声明时明确表明需要派生类去重写的那些成员方法,这样如果程序员在成员方法实体定义中做的不对编译器可以报错提醒 -
继承的终止final
(1)一个class不希望被继承(不想做父类),可以定义时用final修饰
(2)一个成员方法不希望被子类override,可以声明时用final修饰
(3)final是C++11引入的
(4)很多其他面向对象语言如java中也有final关键字,也是这个作用 -
using关键字
(1)用法1就是using namespace std;这种
(2)用法2与class的继承和访问权限限制有关,属于一个声明,能够让private继承的子类去声明并访问父类中本来无权限访问的成员 -
operator
(1)用于运算符重载,也就是为一个class重定义某种运算符 -
friend
(1)让不属于一个class的外部函数也能访问class内受保护的成员变量
(2)实际上是对面向对象的一种扩展或者说破坏,在面向对象深入理解之后再来学习更好 -
explicit
(1)本意为显式的,对应implicit隐式的
(2)用来修饰只有一个参数的构造函数,以阻值构造函数不合时宜的类型转换
(3)很简单一个特性,第2部分再详解
总结
理解struct和class的使用
理解什么是面向对象
理解static在C中的用法和C++中新增用法
理解关键字virtual、重写override与重载overload、final、using、operator、friend、explicit
学习记录,侵权联系删除。
来源:朱老师物联网大课堂