我们之前学过的c语言就是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
而c++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
2. 什么是类?什么是对象?3. c ++ 类的引入与定义举个例子: 类就相当于一张图纸,或者蓝图,通过这个设计图纸可以设计出不同的实例物体。
c语言中,结构体只能定义变量,但在c++中,结构体不仅可以定义变量,还可以定义函数,c++将struct变为了类。
#include#include using namespace std; struct Student { //定义类的方法: void StudentInfo(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.StudentInfo("张三", "男", 20); //实例化对象s s.PrintStudentInfo(); return 0; }
注意: c++更喜欢用 class代替 struct来定义对象。
class className
{
//类体:由成员函数(方法)和成员变量(属性)构成
};//注意分号别漏哦!
那 class 和 struct有什么区别呢?
这就不得不谈到类的访问限定符
3.1 访问限定符:访问限定符有三种 :
- public (共有)
- protected (保护)
- private (私有)
2.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
3. class的默认访问权限为private,struct为public。这也就解释清楚了class 与struct的区别。也就是说:没有public修饰,class定义的类的属性方法无法访问!
class Dog
{
void InitDog(const char* name, const char* gender, const char* breed)
{
strcpy(_name, name);
strcpy(_gender, gender);
strcpy(_breed, breed);
}
void PrintDogInfo()
{
cout << "_name" << " " << _gender << " " << "_breed";
}
char _name[20];
char _gender[3];
char _breed[10];
};
int main() {
Dog d;
d.InitDog("可乐","公","泰迪");
return 0;
}
class Dog
{public: //加上public后就完美解决
void InitDog(const char* name, const char* gender, const char* breed)
{
strcpy(_name, name);
strcpy(_gender, gender);
strcpy(_breed, breed);
}
void PrintDogInfo()
{
cout << "_name" << " " << _gender << " " << "_breed";
}
char _name[20];
char _gender[3];
char _breed[10];
};
int main() {
Dog d;
d.InitDog("可乐","公","泰迪");
return 0;
}
在实际应用中 我们一般不希望别人直接访问修改我们的属性,我们可以将其私有化!
class Dog
{
public:
void InitDog(const char* name, const char* gender, const char* breed)
{
strcpy(_name, name);
strcpy(_gender, gender);
strcpy(_breed, breed);
}
void PrintDogInfo()
{
cout << "_name" << " " << _gender << " " << "_breed";
}
private:
char _name[20];
char _gender[3];
char _breed[10];
};
3.2 类的定义方式:
1.声明和定义全部放在类体中,需要注意的是,成员函数如果在类中定义,编译器可能会将其当作内联函数处理。
2.声明放在类的头文件 .h中,类的实现放在.cpp中。
(一般情况下使用第二种方式。)
如下图所示:
一(class.h中的声明)
二.(test.cpp中的实现)
面向对象的三大特性:封装、继承、多态 。
(目前我们只研究封装)封装:将数据和操作数据的方法有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
封装本质上一种管理:举个例子,我们如何管理兵马俑呢?如果我们什么都不管,兵马俑就会被肆意的破坏。因此我们先建造一个房子把兵马俑封装起来。但是我们又开放了售票通道,可以买票进入封装,在合理的监管机制下进去参观。 类也是如此,我们使用类数据和方法都封装到一起,不想给别人看到的用private 和protected保护起来,开放的用public让一些公有成员函数可以被合理的访问。
5.类的实例化: 用类类型创建对象的过程,称为类的实例化。正如我在开头提到的,类只是一个图纸,要想从图纸变成真正的实物,需要将图纸实例化,也就是创建对象。
注意:
- 类只是一个模型,图纸,限定了类的成员、方法,但是定义出一个类并没有分配实际的内存空间来储存他们!!
- 一个类可以实例多个对象,实例化出的对象才会占用实际的物理空间,存储类成员变量!
类对象只保存成员变量,成员函数放在公共的代码段!
成员变量大小的计算同c语言结构体大小的原则,遵循内存对齐。
class A
{
public:
void f1() {};
private:
int _a;
char _b;
};
class B
{
public:
void f2() {};
void f3() {};
private:
char _a;
int _b;
int* pa;
};
int main() {
cout << "A的大小 :" << sizeof(A) << endl;
cout << "B的大小:" << sizeof(B) << endl;
return 0;
}
先不要看答案,自己算算试试喔(注:在64位操作系统下的结果)
你算对了吗?没有的话好好复习c语言的结构体喔!
int main() {
Student s1;
Student s2;
s1.StudentInfo("孙权","男",28);
s2.StudentInfo("徐盛", "男", 18);
//通过student类创建的两个对象s1 和 s2
s1.PrintStudentInfo();
s2.PrintStudentInfo();
return 0;
}
问题: Student类实例化了两个对象s1. s2 他们都调用了StudentInfo,而他们再调用PrintStudentInfo()方法时,该函数是怎么知道是谁调用的它呢??
原因: c++ 通过 this指针解决这个问题,c++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象,在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有编译器的操作对用户是透明的,即用户不需要来传递,编译器自动完成!
void PrintStudentInfo( Student *this)//编译器编译时会加上,但是自己不能加啊!
{
cout < _name << " " << this->_gender << " " << this->_age << endl;
}
this指针的特性:
1.this指针的类型: 类类型 const
2. 只能在 "成员函数"内部使用
3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象的地址作为实参传递给this形参,所以对象中不存储this指针
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
这就是类和对象初阶的全部内容,希望对大家的学习有所帮助! 谢谢大家的观看!!



