目录1.作用域2.可见性3.对象的生存期4.类数据的共享5.类共享数据的保护1.作用域 作用域:一个标识符在程序正文中有效的区域。 函数原型(函数声明)作用域 例如函数原型void
作用域:一个标识符在程序正文中有效的区域。
函数原型(函数声明)作用域
例如函数原型void Print(int a);
,变量a的作用域为括号左右之间。
局部作用域
例如如下函数定义,变量a
的作用域为大括号之间。
void Print(){
int a = 0;
std::cout << a << std::endl;
}
类作用域
X
类的成员m
具有类作用域(设其一个实例对象为x),以下是在不同环境下对m的访问方法:
1.类内访问:
直接通过标识符m访问。
2.类外访问:
普通成员通过x.m
类成员通过
X::m
对象指针通过
ptr->m
命名空间作用域
在XX命名空间中声明的对象m,其作用域在命名空间之内。命名空间外想访问该对象要以XX::m的方式进行。
namespace XX{ // 命名空间中声明
void Print();
}
XX::Print(){ // 命名空间外定义
//Print函数的定义
}
XX::Print() // 命名空间外使用
using
语句可以简化对命名空间内对象的访问:
using XX::Print
;语句后,其后只需要通过Print就可以调用该函数对象。using namespace XX
;语句后,其后只需要通过函数名就可以调用XX命名空间下的对象。可见性:程序运行到某一点,能够引用到的标识符,称该标识符为可见的。
可见性隐藏规则:在多个具有包含关系的作用域声明的同名标识符,外层标识符在内层不可见。
全局变量:可以被本程序所有对象或函数引用。
extern
声明引用的全局变量为其他编译单元中已经定义的全局变量。static
声明的全局变量只能在本编译单元中使用,不能在其他编译单元用extern
声明引用。局部变量:只能在内部作用域内被引用
生存期:从对象内存空间被分配到被释放的期间。
静态生存期:对象的生存期与程序的运行期相同。
static
关键词声明的对象具有静态生存期,在对应局部作用域中具有可见性。动态生存期:对象的生存期为声明点到声明点所在作用域的结束点之间。
面向结构编程:
程序模块:函数
数据共享方式:参数传递、全局变量
面向对象编程:
程序模块:类
数据共享方式:类的静态成员(类内数据共享)、类的友元(类外数据共享)
类的静态数据成员(类属性):类变量由该类所有实例对象共享,用static修饰。
设X类的静态成员为m,类的一个实例对象为x:
类的静态函数成员(类方法):主要是处理类属性或者处理该类下多个实例对象的方法,用static
修饰。
设X类的静态函数为func,类的一个实例对象为x:
X::func
进行调用。x.func
调用,但是为了代码的可读性,不推荐这样使用。
// 静态成员案例
#include<iOStream>
using namespace std;
class A {
public:
static int s_count; // 私有静态数据成员声明
static void set_count(int i) { // 静态方法定义
s_count = i;
}
void UsinGCount(){
s_count++;
}
};
int A::s_count = 0; // 私有静态数据成员类外定义(注意要在前面加上数据的类型说明符)
int main() {
A::s_count; // 通过类名调用
A::set_count(11); // 对象初始化前通过静态函数成员访问
A a1;
a1.UsingCount(); // 通过普通函数成员修改静态数据成员
cout << a1.s_count << endl; // 通过对象访问静态数据成员
A a2;
a2.UsingCount();
cout << a2.s_count << endl; // 如果输出结果是13,则证明静态数据成员是共享的
}
输出结果:
12
13
友元关系:一个类主动声明其他类或函数是他的友元,进而给他们提供本类的访问特许,用friend
修饰。
友元函数:被一个类声明为友元的函数,在他的函数体内可以通过对象名访问类的私有和保护成员。
友元类:被一个类A声明为友元的另一个类B,类B内所有成员函数都是类A的友元函数。
//友元数据共享案例
#include<iostream>
using namespace std;
class A {
private:
int m_nums = 10; // 私有数据成员
friend class B; // 友元类声明
};
class B { // 友元类
public:
void Print(A& a) { // 友元函数
cout << a.m_nums << endl; // 通过对象名访问私有成员
}
};
int main() {
A a;
B b;
b.Print(a); // 访问私有数据成员
}
结果输出:
10
1
常对象:常对象的数据成员值在对象整个生存期间不能被更改。
设A类的常对象为a
,常函数成员为func
,常数据成员为m
:
const A a
;常函数成员:能被常对象调用访问常数据成员。
const
。const
可以用于函数重载,通过非const
对象调用重载函数优先调用非const的重载函数。常数据成员:值在初始化后不能被更新。
const
数据类型 m
;。
//常成员案例
#include<iostream>
using namespace std;
class A {
public:
void Print()const { // 不修改对象数据成员值的函数应该设为常函数
cout << a << ',' << b << ',' << s << endl;
}
A(int i) :b(i) {}; // 初始化列表初始化
private:
const int a = 1; // 已初始化的常数据成员
const int b; // 未初始化的常数据成员
const static int s; // 常静态数据成员
};
const int A::s = 3; // 类外定义
int main() {
A a(2);
a.Print();
}
结果输出:
1,2,3
1
常引用:常引用所引用的对象被视为常对象。
const
数据类型 &引用名。const
的引用只能绑定到普通对象。const
进行应用到此这篇关于c++ 数据共享与保护的文章就介绍到这了,更多相关C++ 数据共享与保护内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C++ 数据共享与保护
本文链接: https://www.lsjlt.com/news/137647.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0