类与对象-----前篇
1:类与对象的初步认知
1.1 类
定义一个类,实际上是定义一个数据类型的蓝图,这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包含了什么,以及可以在这个对象上执行哪些操作。
类定义是以关键字class开头,后跟类的名称,类的主体是包含在一对花括号中,类定义后面必须跟着分号或声明列表,例如,我们使用关键字class定义一个Date类,如下所示:
class Date {
public:
int _year;
int _month;
int _day;
}
关键字public确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。
1.2 对象
类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了Date类的两个对象:
Date d1
Date d2
2:类的引入
C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
struct Student
{
void SetStudentInfo(const char* name, const char* gender, int age)
{
strcpy(_name, name);
strcpy(_gender, gender);
_age = age;
}
void PrintStudentInfo()
{
cout<<_name<<" "<<_gender<<" "<<_age<<endl;
}
char _name[20];
char _gender[3];
int _age;
};
int main()
{
Student s;
s.SetStudentInfo("Peter", "男", 18);
return 0;
}
上面结构体的定义,c++中更喜欢用class来代替
3:类的定义
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方式:
- 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class Date {
public:
void print(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
- 声明放在.h文件中,类的定义放在.cpp文件中
test.h
class Date {
public:
void print(int year, int month, int day);
private:
int _year;
int _month;
int _day;
};
test.cpp
#include"test.h"
void Date::print(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
一般情况下,更希望采用第二种方式
4:类的访问限定符及封装
4.1 访问限定符
【访问限定符说明】
- public修饰的成员可以在类外被直接访问
- private和protected修饰的成员不能在类外直接访问
- 访问权限作用域从该访问限定符出现的位置直到下一个访问限定符出现为止
- class的默认访问权限为private,struct为public(因为struct要兼容C)
注意:访问限定符只有在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
4.2 封装
面向对象的三大特性:封装,继承,多态
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
5:类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员,需要使用::作用域解析符指明成员属于哪个类域
class Date {
public:
void print(int year, int month, int day);
private:
int _year;
int _month;
int _day;
};
//这里需指定print属于Date类
void Date::print(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
6:类的实例化
用类类型创建对象的过程,称为类的实例化
class Date {
private:
int _year;
int _month;
int _day;
public:
void print(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
};
int main() {
Date d;
d.print(1990, 1, 1);
}
7:类成员函数的this指针
7.1 this指针的引出
首先,创建一个Date类
class Date {
private:
int _year;
int _month;
int _day;
public:
void GetDate(int year, int month, int day) {
_year = year;
_month = month;
_day = day;
}
void print() {
cout << _year << "-" << _month << "-" << _day << endl;
}
};
int main() {
Date d1,d2;
d1.GetDate(1990, 1, 1);
d2.GetDate(2000, 1, 1);
d1.print();
d2.print();
return 0;
}
c++编译器给每个“成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
7.2 this指针的特性
- this指针的类型:类类型*const
- 只能在“成员函数”内部使用
- this指针本质上是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象不存储this指针
- this指针是成员函数第一个隐含的指针形参,一般情况下由编译器通过ecx寄存器自动传递,不需要用户传递