类的初步了解:
我们在c语言中,结构体里面只能定义变量,在c++中结构体里面现在可以定义函数
struct stu { void test1() { ; } int test2() { ; } int a; int b; int* c; };
所以在c++中,c++兼容c的用法同时c++也对struct进行了升级,让其变成了类,另外可以直接用结构体的名称来定义变量(也就是可以用上面代码中的 stu 来定义变量) 我们类里面的函数叫做 成员函数 变量叫做 成员变量
给大家穿插一个知识点,我们的成员变量在类里面只是一个声明,就像上面的a,b,c 只是声明,我们是在创建对象的时候才会有它的定义,后面的构造函数大家学后,就明白了。那你可能会说“int a =10;”这样写是不是定义呢?
当然也不是定义,这里的10是一个缺省值,用于初始化列表中使用,大家学到后面就知道了
成员变量的名字不要和成员函数中形参的名字相同,因为在使用的时候我们会采用就近原则它里形参的定义近就用形参:
struct stu { void test1(int a) { a = a; } int test2() { ; } int a; int b; int* c; };
这里的test1就是这种情况,所以是不能这样写的,对此,我们对成员变量的命名就可以自己加一些符号,既方便自己写的时候不容易搞混,也不会出现上面那种情况,我个人习惯是在变量的前面加上 _ 这个下划线,每个公司也都是有自己的标准来定义成员变量的
虽说我们的c++是兼容c语言的 我们可以用struct定义 但我们在c++就更喜欢使用 class 来定义我们写出来的类,可以用来定义变量,但现在这些变量我们都叫做 对象 (用类来定义了一个对象)
既然我们可以用class和struct 来定义类,那他们两个有什么区别呢?
访问限定符:
这里与这个相关的就是 封装 ,我们自己写的东西有的我不想让你随便访问我们就会用一个访问限定符把他封装起来(private)这个意思是 私有的 还有两个是 public 和 protect
struct stu { void test1(int a) { _a = a; } int test2() { ; } int _a; int _b; int* _c; }; int main() { stu tmp; tmp.test1(10); tmp._b=10; }
这里我们的 _a 和 _b都被我们赋值成了 10 一个是通过函数 一个在类外面直接赋值 大家想想如果这里我把struct stu 换成 class stu 又会怎样呢?它会不会报错呢?
class stu { void test1(int a) { _a = a; } int test2() { ; } int _a; int _b; int* _c; }; int main() { stu tmp; tmp.test1(10); tmp._b=10; }
答案肯定是会报错的,不知道大家看出来他们两个之间的差别了嘛?
我们的struct定义的类,它里面都是默认为共有的,是可以随便访问的
class定义出来的类,它里面都是默认为私有的,是不可以在类外访问的
class stu { public: void test1(int a) { _a = a; } int test2() { ; } int _a; int _b; int* _c; }; int main() { stu tmp; tmp.test1(10); tmp._b=10; }
改成这样就是正确的了(当然我们的struct也是可以加访问限定符的哦),我们通常的写法是把成员变量用private封装起来,不让你随便访问改变我们的值(因为如果改变了是很有可能影响到我们写的函数的功能的),但如果说有些变量是我们常常访问的,也是可以把它放到 public 里面去的
我们的一个访问限定符限制的范围是从当前的位置到下一个访问限定符截至或者是到末尾截至,至于protect大家学习到继承(面向对象的三大特性:封装、继承、多态)就知道了
在了解class和struct的区别中,我们也了解了一下封装,封装大家可以理解为本质是一种管理 封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现的细节,仅对外公开接口来和对象进行交互
类的作用域:
我们定义出来的类,也相当于是定义了一个新的作用域,注意这里是一个作用域,作用域的特点有什么,我们在不同的作用域内是可以有同名函数同名变量的哦,我们一般都叫类定义出来的域叫 类域
既然有了一个类域,当我们想要在这个域的外面,定义函数的时候该怎么办呢?这个时候 :: 这个域作用限定符就可以了
class stu { public: void test1(int a); int test2(char ch); private: int _a; char _b; }; void stu::test1(int a) { _a = a; } int stu::test2(char ch) { _b = ch; }
我们这里使用了域作用限定符,就不属于是在类外访问变量的错误做法,我们这里已经表明了我们是这个域里面的,所以可以这样在类外定义函数,像上面我们写得在类外操作私有成员就是不行的
注意:我们在类里面定义的函数都是 内联函数,注意是类里面定义的才是哦,所以根据内联函数的特性,我们一般,短小的函数可以直接在类里面定义,长一点的函数就可以选择在类外定义,当然这个不是标准看个人习惯
注意:我们在类里面定义的函数满足内联函数的特性,内联只是给编译器的一个建议,如果函数篇幅较长,就不会去展开它,而是去调用