引子
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
什么是对象?
对象表示的是某一类事物的抽象的名词和概念,是对一类事物的抽象表示。
实例化对象根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同
**类 **对象在计算机中的表示。
类 实例化对象 对象 三者的关系
对象 编程实现成 类
类 的实例化成为 实例化对象
- 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
- 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
- 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图
class 与 struct
根据上述定义不难发现c++的类与c语言的结构体功能上是相似的
c++是从c语言发展出来的
c++为何不沿用结构体呢?
- 结构体外可以之间访问结构体中的数据,无法对数据进行保护与权限控制
- 结构体中的数据与对数据的操作(函数)是分离的,也因此程序的复杂性很难控制,增加了程序的数据处理与维护难度,严重影响生产效率
lass 与 struct存在很高的相似性,c++为何保留struct?
c++要兼容c语言,因此C++中保留了很多C的东西,其中之一便是struct
struct在cpp中的演变
c语言中时(面向过程的编程语言认为,数据与操作分离)
struct是一种数据结构,孤儿不能包括函数
c++中时(面向对象的编程语言认为,数据与操作是一个整体不应该分开)
struct也因此有了新的发展
- 可以包括成员函数
- 可以实现继承
- 可以实现多态
struct 与 class的区别
- 默认继承权限不同,class 是 private struct 是 public
- 默认访问权限不同,class 是 private struct 是 public
封装
c++实现封装的方法:用类将对象的属性与方法结合在一块,使得对象更加完善,通过访问权限选择性的将接口提供给外部用户使用
访问限定符
访问限定符说明
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
类
类的定义
class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
略。
类体中内容称为类的成员:
- 类中的变量称为类的属性或成员变量;
- 类中的函数称为类的方法或者成员函数。
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域
成员函数的定义
成员函数的定义有两种
声明与定义未分离:
成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class Person {
public:
void print()
{
cout << _name << " " << _sex << " " << _age << endl;
}
private:
string _name;
string _sex;
int _age;
};
声明与定义分离:
类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::;
//Person.h
void Person::print()
{
cout << _name << " " << _sex << " " << _age << endl;
}
//Person.cpp
#include"Person.h"
class Person {
public:
void print();
private:
string _name;
string _sex;
int _age;
};
类对象在内存中的存储
在c++编译系统中,数据与函数是分开存放的。
在实例化对象中,只保存成员变量,成员函数存在公共代码段
以代码为例
成员变量在内存中的存储与 c语言struct在内存中的存储是一致的
可以参考我这篇博客
结构体在内存中的存储
this指针
c++通过this指针来区分同一类的不同实例化对象
- C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象。
- 在函数体中所有“成员变量”的操作,都是通过该指针去访问。
- 只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针的特性
- this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
- 只能在“成员函数”的内部使用
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。
所以对象中不存储this指针。 - this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用
户传递