类的引入
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("yiyi", "女", 18);
return 0;
}
类的定义
class className {
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。
类中的元素称为类的成员;
类中的数据称为类的属性或者成员变量;
类中的函数称为类的方法或者成员函数。
类的两种定义方式:
- 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
class Person{
public:
//显示基本信息
void shouInfo(){
cout<<_name<<"-"<<_sex<<"-"<<age<<endl;
}
public:
char*_name;//姓名
char*_sex;//性别
int _age;
}
- 声明放在.h文件中,类的定义放在.cpp文件中
//头文件
class Person{
public:
//显示基本信息
void shouInfo();
public:
char*_name;//姓名
char*_sex;//性别
int _age;
}
//源文件
void Person::shoeInfo(){
cout<<_name<<"-"<<_sex<<"-"<<age<<endl;
}
一般情况下,第二种方式更常用。
类的访问限定符及封装
访问限定符
C++实现封装的方式:用类将对象的属性与方法
结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
说明:
- public修饰的成员在类外可以直接被访问;
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的);
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- class的默认访问权限为private,struct默认为public(因为struct要兼容C)
访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
封装
面向对象的三大特性:封装、继承、多态。
在类和对象阶段,我们只研究类的封装特性,封装就是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
封装本质上是一种管理
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
class Person {
public:
void PrintPersonInfo();
private:
char _name[20];
char _gender[3];
int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo() {
cout<<_name<<" "_gender<<" "<<_age<<endl;
}
类的实例化
用类类型创建对象的过程,称为类的实例化。
- 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量