C++ class
C++的class和其他的高级语言如C#/Java有些不一样。这是C++面向对象的核心。
一点一点来:
一 , 创建class
#includeusing namespace std;class My_First_Class{ public: int a;};int main(){ My_First_Class c; c.a = 2; cout << c.a << endl; return 0;}
重点:
①:创建类 , 需要用关键字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放在了栈区。其实可以将其放入堆去,其方案是利用指针。代码如下:
#includeusing namespace std;class My_First_Class{ public: int a; private: int c;};int main(){ //My_First_Class c; //a = 2; My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; return 0;}
其结果如下图:
到目前我们会发现一个很基础的问题 , 成员的初始化(如果等待调用者自己一个一个用代码实现初始化的话 ,很有可能会漏掉),当然在C#/Java等高级语言中 , 这个就不成问题了。
在C++中,提供了构造函数可以提供初始化的
#includeusing namespace std;class My_First_Class{ public: int a; My_First_Class() { a = 1; } private: int c;};int main(){ My_First_Class c; cout << c.a << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0;}
注意:
①:构造函数和C#/Java一样 , name使用class的名称 , 而且没有返回值
②:构造函数默认应该放在public之下,不然会报错。
③:构造函数必须要在需要初始化成员的后面创建,如要初始化a(int) , 必须在int a;的后面创建。
初始化列表:
#includeusing namespace std;class My_First_Class{ public: int a; private: int c; public: My_First_Class():a(1),c(2) { }};int main(){ My_First_Class c; cout << c.a << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0;}
注意:
①:My_First_Class():a(1),c(2) 赋值的顺序是a , c的声明的顺序:
和在构造函数中:后面写的顺序无关:
如下面的写法,就不会得到预期的值:
#includeusing namespace std;class My_First_Class{ public: int a; int m; My_First_Class():m(2),a(m) { }};int main(){ My_First_Class c; cout << c.a << endl; cout << c.m << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0;}
结果为:
因为赋值的顺序是先a后m(a在m前进行了声明)
当然 , 构造函数也可以是有参的和C#/Java一样 , 这里就不讲了
二:类内声明 , 类外定义
#includeusing namespace std;class My_First_Class{ public: int a; int m; My_First_Class():m(2),a(1) { } int sum();};int My_First_Class::sum(){ return a + m;}int main(){ My_First_Class c; int sum = c.sum(); cout << c.a << endl; cout << sum << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0;}
运行结果 :
当然 , 这种只是演示(实际开发中不这么搞) 。 实际开发中 , 将声明写在都文件中 , 将实现写在源文件中:
定义一个头文件:
实现:
#includeusing namespace std;#include "HeadOne.h"My_First_Class::My_First_Class(){ a = 10;}int main(){ My_First_Class c; cout << c.a << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0;}
结果: