目录
1.面向过程和面向对象
2.类和对象
3.类定义的格式
4.类的访问限定符及封装
4.1 访问限定符
5.类的作用域
6.类的实例化
7.类对象模型
8.this指针
8.1问题引入
8.2 this指针的特性
1.面向过程和面向对象
面向过程:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
例如:蛋炒饭,需要经过起锅、烧油、放入蛋液、倒入米饭、调味、翻炒、装盘等步骤(不是专业厨师,可能过程存在问题)才能完成这件事。
面向对象:C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
例如:蛋炒饭,对象有:鸡蛋、锅、人、米饭、配料,面向对象关注的是这5个对象之间的交互,不需要关注完成这件事的流程。
2.类和对象
类:类:用来对实体(对象)进行描述的,对象有什么属性,以及对象具有什么功能(行为)是一种自定义类型。类是一个模型,限定了对象中有那些属性和成员,类定义好了之后,并不能直接在类中存储数据。
对象:现实生活中实实在在存在的对象是类的具体的体现,用类类型创建出来的变量---->对象。
3.类定义的格式
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class
为
定义
类的关键字
,紧跟其后的
ClassName
为
类的名字,{ }
中为
类的主体
,注意
类定义结束时后面分号
。
类中的元素称为
类的成员:
类中的
数据
称为
类的属性
或者
成员变量
;
类中的
函数
称为
类的方法
或者
成员函数
。
也可已使用
struct
关键字(在使用类的时候,可以不写struct关键字),不同于C语言中的struct结构体。
类的两种定义方式:
1.
声明和定义全部放在类体中
,需要注意:
成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class phone{
void Init(char model[], float size, int CPU){
strcpy(_model, model);
_size = size;
_CPU = CPU;
}
void Print(){
cout << _model << "-" << _size << "-" << _CPU << endl;
}
void ListenMusic(){
cout << "listen to music" << endl;
}
void SurferInternet(){
cout << " surfering Internet" << endl;
}
char _model[12];
float _size;
int _CPU;
};
2.
声明放在
.h
文件中,类的定义放在
.cpp
文件中
声明:
//声明
class phone{
void Init(char model[], float size, int CPU);//初始化
void Print();//打印信息
void ListenMusic();//听音乐
void SurferInternet();//上网
char _model[12];//型号
float _size;//尺寸
int _CPU;//处理器
}
定义:(需要加作用域限定符::)
//初始化
void phone::Init(char model[], float size, int CPU){
strcpy(_model, model);
_size = size;
_CPU = CPU;
}
//打印信息
void phone::Print(){
cout << _model << "-" << _size << "-" << _CPU << endl;
}
//听音乐
void phome::ListenMusic(){
cout << "listen to music" << endl;
}
//上网
void phone::SurferInternet(){
cout << " surfering Internet" << endl;
}
4.类的访问限定符及封装
面向对象的特性:封装,继承,多态,(抽象)
抽象:对复杂事物的认知过程
4.1 访问限定符
C++
实现封装的方式:
用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其
接口提供给外部的用户使用
。
【访问限定符说明】 1. public 修饰的成员在 类外 可以直接被访问 2. protected和private 修饰的成员在 类外 不能直接被访问 ( 此处 protected 和 private 是类似的 ) 3. 访问权限 作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 4. class的默认访问权限为private,struct默认访问权限为public( C++需要兼容C语言,所以C++中struct可以当成结构体去使用。另外C++中struct还可以用来定义类。 和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是的成员默认访问方式是 private。 ) 注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。 4.2、封装 封装:将 数据 和 操作数据 的方法进行有机结合, 隐藏对象的属性和实现细节 , 仅对外公开接口来和对象进行交互 。封装本质是一种管理。
5.类的作用域
类定义了一个新的作用域
,类的所有成员都在类的作用域中
。
在类体外定义成员
,需要使用
::
作用域解析符,指明成员属于哪个类域。
6.类的实例化
用类类型创建对象的过程,称为类的实例化
1.
类只是
一个
模型
一样的东西,限定了类有哪些成员,定义出一个类
并没有分配实际的内存空间
来存储它
2.
一个类可以实例化出多个对象,
实例化出的对象
占用实际的物理空间,存储类成员变量
3.
做个比方。
类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图
,只设计出需要什 么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
类:
class person{
void information(){
}
public:
char* _name;
char* _gender;
int _age;
};
class person{
void information(){
}
public:
char* _name;
char* _gender;
int _age;
};
类的实例化(对象):
void test(){
person man;
man._name = "lihua";
man._gender = "male";
man._age = 19;
}
7.类对象模型
// 类中既有成员变量,又有成员函数
class A {
public:
void funcA(){}
private:
int _a;
};
// 类中仅有成员函数
class B {
public:
void funcB() {
}
};
// 类中什么都没有---空类
class C{
};
int main(){
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
return 0;
}
对于A2、A3这种特殊的类(没有成员变量),编译器为了区分同一个类创建出的不同的对象,主流编译器中(vs2013 /g++):给A2和A3分配了1个字节
结论:一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。8.this指针
8.1问题引入
问题:在setDate(int year, int month, int day)和displayDate()成员函数中,没有任何关于对象的说明,那这些成员方法在执行的时候,是如何知道要对那个对象进行操作的?
解答:C++ 中通过引入 this 指针解决该问题,即: C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。 在成员函数内部和main函数中分别查看对象的地址:
class Date{
public:
void displayDate(){
cout<
二者看到的对象地址是相同的
8.2 this指针的特性
1. this
指针的类型:
类
类型
* const
。
2.
只能在
“
成员函数
”
的内部使用。
3.
this
指针本质上其实是一个成员函数的形参
,是对象调用成员函数时,将对象地址作为实参传递给
this形参。所以对象中不存储
this
指针
。
4.
this
指针是成员函数第一个隐含的指针形参,一般情况由编译器通过
ecx
寄存器自动传递,不需要用户
传递。
调用约定:
this指针存在哪里?
this的地址就在esp(栈顶)和ebp(栈底)之间,而esp和ebp标记的就是Init函数的栈帧,this指针就存储在栈上。
this指针可以为空吗?
当this指针为空时,如果在成员函数中没有访问任何成员变量或者成员函数,则代码不会崩溃,否则就崩溃了。
下面这个成员函数就不会崩溃:
void func(){
cout << "func" << endl;
}



