目录
1.面向过程和面向对象
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
2.引入类
C语言结构体中只能定义变量,在C++结构体可以定义变量还可以定义函数。其中C++更喜欢用class来代替。class和struct的区别:class默认访问权限为private,struct默认访问权限为public(因为struct需要兼容C)。
3.类定义
class定义类的关键字,date为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。 类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
class date
{
public:
//类的方法或成员函数
void Init(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
//类的属性或成员变量
private:
int _year;
int _month;
int _day;
};
3.1声明和定义全放在类体中
3.2声明和定义分开存放
类声明放在.h头文件中,成员函数定义放在.cpp中。成员函数名前要加类名 ::
4.类的访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选 择性的将其接口提供给外部的用户使用。
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
5.类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
class date
{
public:
//类的方法或成员函数
void Init(int year, int month, int day);
//类的属性或成员函数
private:
int _year;
int _month;
int _day;
};
//这里需要指定Init是属于date这个类域
void date::Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
6.类的实例化
用类类型创建对象的过程,称为类的实例化。
1.类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没 有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个 类,来描述具体学生信息。
2.一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。类是没有空间的,只有通过类实例化出来的对象才具有具体的年龄。
7.类对象模型
7.1如何计算类大小
类中既可以有成员变量,又可以有成员函数,如何计算一个类的大小?
类的大小,实际上是类中成员变量之和,需要注意内存对齐。
详情见之前的博客http://t.csdn.cn/00Ovq
注意:空类的大小,编译器会给空类一个字节来标识这个类的对象。
7.2类对象存储方式
类对象只保存成员变量,成员函数存放在公共的代码段。
8.this指针
8.1this指针引出
类可以定义不同类,但是函数体中没有关于不同对象的区分,当不同对象调用不同函数时,怎么知道如何设置不同对象呢?
C++通过引入this指针来解决问题,给每个非静态的成员函数增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),所有成员变量操作都让该指针去访问。只不过不需要用户来传递,编译器自动完成。
8.2this指针的特性
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2. 只能在“成员函数”的内部使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递。