赞
踩
在C语言中,结构体只能定义变量;而在C++中,类不仅可以定义变量,还可以定义函数
我们首先来写一个简单的类
- struct student{
-
- char name[10];
- int age;
- int id;
- };
是不是和C语言的结构体一模一样??是的!!!
在C++中,struct跟着升级成为了类
struct 就是类的关键字,student 就是类名
*所以C++可以直接使用类名来定义
- int main(void)
- {
- struct Student s1;
- Student s2;
-
- strcpy(s1.name,"小明");
- s1.age = 10;
- s1.id = 123;
-
- strcpy(s2.name,"小红");
- s2.age = 12;
- s2.id = 111;
-
- return 0;
- }
我们既可以用struct Student s1来定义,也可以用Student s2来定义(通过使用类名直接定义)
在C语言中,只能用struct Student来定义,不能直接用类名定义
在C语言中,我们想要将s1中的变量进行初始化,还得一个个赋值,特别麻烦
但是在C++中,我们不仅可以定义变量,还可以定义函数方法
我们可以定义一个“初始化”函数:
- struct Student{
-
- //成员变量
- char _name[10];
- int _age;
- int _id;
-
- //成员方法
- void Init(const char* name,int age,int id)
- {
- ...
- }
-
- };
我们在C++中,称这些变量为成员变量,称这些函数为成员方法
我们来写一个简单的打印函数,测试一下
- #include <iostream>
- using namespace std;
-
- struct student{
- char _name[10];
- int _age;
- int _id;
-
- void Init(const char* name,int age,int id){
- strcpy(_name,name);
- _id = id;
- _age = age;
- }
-
- void Print(){
- cout<<_name<<" "<<_age<<" "<<_id<<endl;
- }
-
- };
-
- int main(void)
- {
- struct Student s1;
- Student s2;
-
- s1.Init("小明",23,111);
- s1.Print();
-
- s2.Init("小红",22,123);
- s2.Print();
-
- return 0;
- }
我们知道,struct在C++中升级成了类,那么C++属于自己的类是什么呢,就是class
- class Student{
- ...
- };
类的关键字:class 类名:Student
***最后一定记得加 ; !!! 加分号
那我们现在将struct改为class
- #include <iostream>
- using namespace std;
-
- class student{
- char _name[10];
- int _age;
- int _id;
-
- void Init(const char* name,int age,int id){
- strcpy(_name,name);
- _id = id;
- _age = age;
- }
-
- void Print(){
- cout<<_name<<" "<<_age<<" "<<_id<<endl;
- }
-
- };
-
- int main(void)
- {
- struct Student s1;
- Student s2;
-
- s1.Init("小明",23,111);
- s1.Print();
-
- s2.Init("小红",22,123);
- s2.Print();
-
- return 0;
- }
我们可以发现它报错了,既然C++中的类是class,那为什么会报错呢
下面我们就来提一下,面向对象的三大特性:封装,继承和多态
①数据和方法放一起
②访问限定符
下面我们来聊一聊访问限定符
C++实现封装的方式:用类将对象的属性和方法结合在一起,让对象更加完善,通过访问权限选择性的将接口提供给外部的用户使用
一共有三种访问限定符,分别是public(公有),protected(保护),private(私有)
我们一看名字就能想到public就是可以在类外访问,而protected和private就是不能在类外访问
**我们的class默认访问权限是private,struct默认访问权限是public,所以我们刚刚的程序会报错
所以我们把刚才的程序加一个访问限定符就好了
- #include <iostream>
- using namespace std;
-
- class student{
- public:
- char _name[10];
- int _age;
- int _id;
-
- void Init(const char* name,int age,int id){
- strcpy(_name,name);
- _id = id;
- _age = age;
- }
-
- void Print(){
- cout<<_name<<" "<<_age<<" "<<_id<<endl;
- }
-
- };
-
- int main(void)
- {
- struct Student s1;
- Student s2;
-
- s1.Init("小明",23,111);
- s1.Print();
-
- s2.Init("小红",22,123);
- s2.Print();
-
- return 0;
- }
那我们继续讨论访问限定符:
①访问权限作用域从该访问限定符出现位置开始,直到下一个访问限定符出现为止
②如果后面没有访问限定符,作用域就到该类结束
封装:将数据和操作方法进行有效结合,隐藏对象的属性和实现细节,仅对外公开接口来实现对象进行交互
①把数据都封装到类中
②可以给你访问的定义为公有,不想给你访问的定义为私有或保护
封装是为了更好的管理,封装的本质就是一种管理
①声明和定义都放在类中
- class Student{
- public:
- void Init(const char* name,int age,int id)
- {
- strcpy(_name,name);
- _age = age;
- _id = id;
- }
-
- void Print()
- {
- cout<<_name<<""<<_age<<""<<_id<<endl;
- }
-
- private:
- char _name[10];
- int _age;
- int _id;
- };
②声明和定义分离
- class Student{
-
- public:
- void Init(const char* name,int age,int id);
- void Print();
-
- private:
- char _name[10];
- int _age;
- int _id;
- };
-
- void Student::Init(const char* name,int age,int id)
- {
- strcpy(_name,name);
- _id = id;
- _age = age;
- }
-
- void Student::Print()
- {
- cout<<_name<<""<<_age<<""<<_id<<endl;
- }
类本身是没有存储空间的,只有建立对象(即实例化),才会有实际的存储空间
类中既有成员变量,又有成员函数,那么它的大小是多少呢
对象中存了成员变量,是否存了成员函数呢?没存成员函数!!
计算类或类对象的大小只看成员变量!!!
this指针的类型:类类型* const
this指针只能在“成员函数”的内部使用
this指针本质上是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。