数据的共享和保护
对象的生存期
static类型的局部变量,生存期在整个程序,局部可见。
void example() { static a=1; int b=2 } 当调用完example函数后,b消亡,a仍然存在; 再次调用该函数时,a值不会再次被赋值,仍保持之前数据;而b需要重新建立,重新赋值。
类的静态数据成员
1.用关键字static声明;
2.为该类的所有对象共享,静态数据成员具有静态生存期;
3.必须在类外定义和初始化,用(::)来指明所属的类.
这个数据属于类的信息,比如统计教师群体中教师的总数,即这个类实例化了多少个对象。
class a{ static int num; //在类内声明 } int a::num=0; //在类外定义和初始化
类的静态函数成员
1.类外代码可以使用类名和作用域操作符来调用静态成员函数;
2.静态成员函数主要用于处理该类的静态数据成员,可以直接调用静态成员函数;
3.如果访问非静态成员,要通过对象来访问。
class a{ private: static int num; int a=1; public: static void shownum(){cout<< num << endl;} //2. static int change(int a);//一个定义的例子; } int a::num=0; int a::change(int a){ a::num=a; //静态数据成员的引用需要加 “类::”来修饰 } int main(){ a:shownum(); // 1. }
类的友元
友元是c++提供的一种破坏数据封装和数据隐藏的机制。
友元函数
在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能
够通过对象名访问 private 和 protected成员
class point { public: point(int x=0, int y=0) : x(x), y(y) { } int getx() { return x; } int gety() { return y; } friend float dist(point &a, point &b); private: int x, y; }; float dist( point& a, point& b) //非成员函数 { double x = a.x - b.x; //通过对象名访问私有成员 double y = a.y - b.y;return static_cast<float>(sqrt(x * x + y * y)); } int main(){ point p1(1, 1), p2(4, 5); cout <<"the distance is: "; cout << dist(p1, p2) << endl; return 0; }
友元类
friend声明是单向授权声明,类a是类b的友元,意味着类a获得了访问类b的私有成员的权限,但类b不能反向访问类a的私有成员;
此处的friend更像是一种"上级声明"
class a { friend class b; public: void display() {cout << x << endl;} private: int x; }; class b { public: void set(int i); void display(); private: a a; //b类中含有a类成员,正常来说是看不到封装的私有成员的 }; void b::set(int i) { a.x=i; } //因为是友元,所以可以通过对象名访问私有成员 void b::display() { a.display(); }
共享数据的保护
- 对于既需要共享、又需要防止改变的数据应该声明为常类型(用const进行修饰);
- 对于不改变对象状态的成员函数应该声明为常函数.
常类型
- 常对象:必须进行初始化,不能被更新
const 类名 对象名 const a a(1,2);
- 常成员: 用const进行修饰的类成员:常数据成员和常函数成员
- 常引用:被引用的对象不能被更新,既增加了效率又避免数据被篡改;常用作形参。
const 类型说明符 &引用名 const int &p;const a &p;
- 常数组:数组元素不能被更新(详见第6章)。
类型说明符 const 数组名[大小]...
-
常指针:指向常量的指针(详见第6章)。
数组
处理无明显规律的大量同类型数据时,可以通过将其存入数组强制性添加一个次序信息,再结合循环语句,对其进行处理。
a[10]
数组名 a 是一个地址(指针)类型常量,对应数组首元素的内存地址,不能被赋值
数组名作函数参数
- 形、实参数都应是数组名(实质上是地址),类型要一样,传送的是数组首地址;
- 对形参数组的改变会直接影响到实参数组.
void rowsum(int a[][4], int nrow) { for (int i = 0; i < nrow; i++) { for(int j = 1; j < 4; j++) a[i][0] += a[i][j]; } } int table[3][4] = {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}}; rowsum(table, 3);
对象数组
point a[3];
实例化3个point类的对象,调用3次构造和3次析构函数;
基于范围的for循环
- 用来遍历容器类十分方便
- c++11标准
double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51}; for (double x : prices) cout<<x<<std::endl;
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/606773.html