C++之类和对象:定义,实例化,this指针,封装
C语言是面向过程的,C++是面向对象的,利用对象交互,接口完成事情。
类的定义:
我们在C语言中可以用struct创建自定义结构体,在C++中可以在结构体中定义函数了,这种就被称为类。
#include<iostream>
using namespace std;class Data
{
public:void Print(int day, int month, int year)//成员函数{cout << year << " " << month << " " << day << endl;}private:int _day;//成员变量int _month;int _year;
};
上述就是一个简单的类,可以用class或者struct,我们一般是用class。
需要注意的是,成员函数如果在类里声明和定义可能会被编译器当作内联函数处理,所以一般我们在类里面定义函数声明,在另一个文件里定义函数(函数前需要加 Data::之类的类名)。
注意成员变量命名的时候也建议加个前缀之类的。
类定义了一个新的作用域,所有的成员都在类作用域里,在类外定义成员,需要使用 :: 作用域操作符。
类的访问限定符:
我们看到上面有 private 之类的符号,这些被称为访问限定符。
公有修饰的成员可以在类外被访问,其他两个都不能在类外被访问(保护在继承才涉及)。
class的默认访问权限是私有的,而struct是公有的。
访问限定符的作用域从该访问符出现到下一个访问限定符出现的位置。如果没有后面没有限定符了,到类结束就结束。
封装:
C++中有了访问限定符,不得不提面向对象的三大特性:封装,继承,多态。
封装本质是一种管控,这里只是封装的一部分,将类的内部隐藏起来,仅对外公开接口来和对象进行交互。
实例化:
用类创建对象的过程叫做实例化,类是一个类似模型的东西,在没有实例化之前是没有分配实际的内存空间的,一个类是可以实例化多个对象,实例化出的对象分配实际的内存空间,存储类成员变量。
today就是用Data类实例化出的对象,只有对象才可以用Print函数。
类对象存储模式:
一个类中既有成员变量,也有成员函数,那么类对象中到底是怎么存储这些的?
所以是只保存成员变量,成员函数存储在公共的代码段里。
所以一个类的大小,其实就是该类中成员变量之和,和结构体差不多,也有内存对齐。(注意空类的大小,编译器给了空类一个字节来唯一标识这个类的对象)。
this指针:
class Data
{
public:void Print(){cout << _year << " " << _month << " " << _day << endl;}private:int _day = 24;//缺省值,成员变量也可以设置缺省值int _month = 4;int _year = 2025;
};int main()
{Data today;today.Print();
}
我们能看到上述代码,Print函数没有形参,但是还是可以打印出 today 的成员变量,但是函数是怎么知道打印的是 today 对象的成员变量呢。
原因就是因为C++给每个非静态的成员函数增加了一个隐藏的指针参数,让指针指向当前对象(函数运行时调用的对象),在函数体中所有成员变量的操作,都可以提高该指针去访问,只不过所有的操作都是透明的,不用用户传递,编译器自动完成。
this指针特性:
1.this的类型:类类型* const,成员函数不可以给this赋值。
2.只能在成员函数内部使用
3.this指针本质上是成员函数的形参,所以对象中不存储this指针。
4.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
5.this指针存在栈上,因为他是形参(有些编译器可能会存储在寄存器)
提出一个疑问:this指针可以是空吗?可以