C++ class
C++的class和其他的高级语言如C#/Java有些不一样。这是C++面向对象的核心。
一点一点来:
一 , 创建class
#include<iostream>usingnamespacestd;classMy_First_Class{public:inta;};intmain(){My_First_Classc;c.a=2;cout<<c.a<<endl;return0;}
重点:
①:创建类 , 需要用关键字class。
②:class也是一种数据类型,{}外面需要以;来结束。
注意点:
①:int a 不能被初始化 , 原因:class没被初始化之前是没有空间分配的,当然其所有的成员也是没有空间的。
②:关于访问修饰符在C++中有3中 private , protected , public
1, 在class中默认为private , 在struct中默认为public
2, class中,访问修饰符可以有多个, 其作用范围为 : 其位置到下一个访问修饰符的位置(如果没有下一个访问修饰符则是到class结束位置既是 “}”),如下图:
③:My_First_Class c; 这种初始化是把My_First_Class类对象c放在了栈区。其实可以将其放入堆去,其方案是利用指针。代码如下:
#include<iostream>usingnamespacestd;classMy_First_Class{public:inta;private:intc;};intmain(){//My_First_Classc;//a=2;My_First_Class*c=newMy_First_Class;c->a=3;cout<<c->a<<endl;deletec;return0;}
其结果如下图:
到目前我们会发现一个很基础的问题 , 成员的初始化(如果等待调用者自己一个一个用代码实现初始化的话,很有可能会漏掉),当然在C#/Java等高级语言中 , 这个就不成问题了。
在C++中,提供了构造函数可以提供初始化的
#include<iostream>usingnamespacestd;classMy_First_Class{public:inta;My_First_Class(){a=1;}private:intc;};intmain(){My_First_Classc;cout<<c.a<<endl;/*My_First_Class*c=newMy_First_Class;c->a=3;cout<<c->a<<endl;deletec;*/return0;}
注意:
①:构造函数和C#/Java一样 , name使用class的名称 , 而且没有返回值
②:构造函数默认应该放在public之下,不然会报错。
③:构造函数必须要在需要初始化成员的后面创建,如要初始化a(int) , 必须在int a;的后面创建。
初始化列表:
#include<iostream>usingnamespacestd;classMy_First_Class{public:inta;private:intc;public:My_First_Class():a(1),c(2){}};intmain(){My_First_Classc;cout<<c.a<<endl;/*My_First_Class*c=newMy_First_Class;c->a=3;cout<<c->a<<endl;deletec;*/return0;}
注意:
①:My_First_Class():a(1),c(2) 赋值的顺序是a , c的声明的顺序:
和在构造函数中:后面写的顺序无关:
如下面的写法,就不会得到预期的值:
#include<iostream>usingnamespacestd;classMy_First_Class{public:inta;intm;My_First_Class():m(2),a(m){}};intmain(){My_First_Classc;cout<<c.a<<endl;cout<<c.m<<endl;/*My_First_Class*c=newMy_First_Class;c->a=3;cout<<c->a<<endl;deletec;*/return0;}
结果为:
因为赋值的顺序是先a后m(a在m前进行了声明)
当然 , 构造函数也可以是有参的和C#/Java一样 , 这里就不讲了
二:类内声明 , 类外定义
#include<iostream>usingnamespacestd;classMy_First_Class{public:inta;intm;My_First_Class():m(2),a(1){}intsum();};intMy_First_Class::sum(){returna+m;}intmain(){My_First_Classc;intsum=c.sum();cout<<c.a<<endl;cout<<sum<<endl;/*My_First_Class*c=newMy_First_Class;c->a=3;cout<<c->a<<endl;deletec;*/return0;}
运行结果 :
当然 , 这种只是演示(实际开发中不这么搞) 。 实际开发中 , 将声明写在都文件中 , 将实现写在源文件中:
定义一个头文件:
实现:
#include<iostream>usingnamespacestd;#include"HeadOne.h"My_First_Class::My_First_Class(){a=10;}intmain(){My_First_Classc;cout<<c.a<<endl;/*My_First_Class*c=newMy_First_Class;c->a=3;cout<<c->a<<endl;deletec;*/return0;}
结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。