1.认识类
#c语言是面向过程的,关注的是过程,分析出求解问题的步骤,用函数逐步解决问题
#c++是基于面向对象的,关注的对象,将一件事情拆分成不同对象,通过对象之间的交互完成
2.引入类
2.1从结构体到类
结构体是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;
}
?struct和class的区别:
- 类是c++对c中结构体的扩展
- c中struct是数据成员的集合,c++中的类是成员函数和数据成员的集合
- c++需要兼容c,所以struct可以定义结构体也可以定义类
- struct的成员默认是public,class的成员默认访问是private
2.2 类的定义
class A{ //A为类名
//类体:成员变量和成员函数
};//注意最后的分号
类中的数据称为类的属性或者成员变量
类中的函数称为类的方法或者成员函数
定义类有两种方式:
- 声明和定义全部放在类体中
- 声明放在.h文件中,定义放在.cpp文件中
2.3 类的访问限定符及其封装
c++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给用户使用
访问限定符:
public:公有
private:私有
protected:保护
?访问限定符说明:
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不可以被访问
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 类体中三个访问限定符不一定要全有,但至少要有一个
- 不能在类声明中给数据成员赋值。C++规定,只有在类对象定义之后才能给数据成员赋初值
class Date{
public:
void fun(int a);
void Printf(int b);
private:
int _day;
int _month;
int _year;
};
封装:将数据和操作数据有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交换
封装的本质是一种管理
2.4类的实例化
用类类型创建对象的过程,称为类的实例化
- 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
- 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
- 类实例化的对象就像是现实中使用设计图设计出的房子,类就像设计纸
在c++中有两种方法创建对象:
(1)在声明类的时候直接创建
class Date{
public:
void fun(int a);
void Printf(int b);
private:
int _day;
int _month;
int _year;
}p1,p2; //p1,p2为创建的两个对象
(2)声明了类之后,在使用的时候创建
class Date{
public:
void fun(int a);
void Printf(int b);
private:
int _day;
int _month;
int _year;
};
int main(){
Date p; //使用时创建一个对象p
return 0;
}
· 在声明类的时候定义的对象是一个全局对象,在他生存期内任何一个函数都可以使用它
· 声明了一个类便声明了一种类型,它并不接收和存储具体的值,只作为生成具体对象的一种“样板”,只有定义了对象后,系统才为对象分配存储空间。
?一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类。
2.5类成员的访问
当定义了一个类的对象后,就可以访问对象的成员了。在类的外部可以通过类的对象对公有成员进行访问,访问对象成员要使用操作符“.”。
访问的一般形式是:
- 对象名.数据成员名
- 对象名.成员函数名(参数表)
- 对象名.成员名实际上是一种缩写形式,它表达的意义是:对象名.类名::成员名
其中“.”叫做对象选择符,简称点运算符,“::”访问限定符
2.6类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符 指明成员属于哪个类域。
- 一个类的所有成员都在该类的作用域内,一个类的任何成员可以访问该类的其他成员。
- 一个类的成员函数可以不受限制地访问类的成员,而在类的外部,对该类的数据成员和成员函数的访问则要受到一定的限制,有时甚至是不允许的,这体现了类的封装功能。
class myclass{
public:
int i;
void init(int);
void show(){
cout<<“i=”<<i<<endl;
// 可以访问类中的数据成员i
}
};
// 这里需要指定init是属于myclass这个类域
void myclass::init(int si){
i=si;
} // 可以访问类中的数据成员i
int fun(){
return i; // 非法,不能直接访问类中的i
}
int main(){
myclass ob;
ob.init(5); // 给数据成员i赋初值5
ob.show();
i=8; // 非法,不能直接访问类中的i,可改写成ob.i=8
ob.show();
return 0;
}