类的引入:
由于C语言是面向过程的编程语言,我们在完成一件事的时候通常习惯将一件事拆分成一个一个小过程来实现,而到了C++就习惯将一件事分成不同的模块,交给不同的对象来处理,每一个对象中承载着数据类型和函数。
(up也是刚刚开始学习C++,对于面向对象的了解还未非常充分,具体阐述请读者查阅其他优秀资料)
既然如此,创建对象的任务自然而然地交到了程序手中,需要创造一个自定义类型变量来实现目的,在C语言阶段的时候我们接触到的自定义类型有struct/union/enum,其中最常用的就是strcut了,故我们重点从struct引导,C语言环境下struct只能定义变量,而不能存放函数,C++环境下struct可以定义函数,但是既有变量又有函数的struct类型我们在C++下习惯使用class来代替,称为类
定义类:class classname{ };,classname称作类类型或类对象
其中我们把类中的变量称为类的成员变量或类的属性,类中的函数称为类的方法或成员函数
struct SA
{
public:
const char* Fun();
private:
char* _member;
};
//
class SA
{
public:
const char* Fun();
private:
char* _member;
};//注意分号
👆两端代码是完全等价的
那么可以说C++中struct和class完全一样吗?不然,为了继承C语言,struct中默认所有属性和方法可在类外访问,而class中默认所有属性和方法只能在类中访问。
这里引入两个关键字:public、private 分别代表公有和私有,
一般我们习惯把方法设为公有,属性设为私有。
类的作用域:
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
class Person
{
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
cout<<_name<<" "_gender<<" "<<_age<<endl;
}
我们更加推荐声明和定义分离使用。
类的实例化:
当我们写好一个类的框架时,编译器不会为其开辟空间,原因是这里我们只是做了一个声明,并没有进行实例化,就好比做好了设计图,还没有具体造房。
类的实例化非常简单:
classname obj;
类的大小:
多次实例化类对象时对于每一个对象它们中的方法是一模一样的,功能也是完全一致,没有必要让每一个对象都有一个独立的方法,故对于类中的方法编译器将其存储到公共代码段存储,不存储在类本身中。
反观之属性对于每一个类是专有的,不容许与其他对象共享,编译器就把属性存储在类中。
因此我们计算类对象大小时,只需要考虑属性即可,大小计算方式与C语言中的结构体相同,需要进行内存对齐,这里不做过多阐述,具体过程可查阅《结构体》一章
this指针:
class Date
{
public :
void Display ()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
void SetDate(int year , int month , int day)
{
_year = year;
_month = month;
_day = day;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
int main()
{
Date d1, d2;
d1.SetDate(2018,5,1);
d2.SetDate(2018,7,1);
d1.Display();
d2.Display();
return 0;
}
思考一下,在执行SetDate函数时,编译器是怎么知道_year、_month、_day是d1还是d2的呢?
其实这里编译器自动补充了一指针,即this,
编译时编译器会将SetDate(int year,int month,int day)处理成SetDate(Date* this,int year,int month,int day),这里的Date* this必须交给编译器来做,于是函数中的所有赋值操作就变成了this->_year、this->_month、this->_day,这里的this是可以手动补充的,但一般我们不这么做。
this的一些特性:
1. this指针类型:类对象 const this
2. 只能在方法中使用
3. 作为一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针
4. this指针是成员函数第一个隐含的指针形参,一般由编译器通过ecx寄存器自动传递*
文章的末尾留给读者一个思考题:
this可以为空指针吗?
文中若有错误,欢迎读者指出,对up来说是莫大的帮助,蟹蟹。
对惹,up如果想要一起学习UU的可以私有Up哈!