1. 标识符的作用域与可见性

  1.1 作用域

    标识符的作用域包括:函数原型作用域、局部作用域、类作用域、命名空间作用域

  (1) 函数原型作用域:函数的参与的作用域就是从函数的开始到结束

  (2) 局部作用域:

void fun(int a)
{
int b = a;
cin>>b;
if(b>)
{
int c; //c的作用域 b的作用域 a的作用域
...
}
}

  (3) 类作用域

    类X中有成员m,m的类作用域的三种表现

    ① 如果X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以直接访问成员m。

    ② 通过表达式x.m或X::m。其中X::m的访问可以访问类X的静态数据

    ③ 通过x->m。指针

  (4) 命名空间作用域(详细请参考:./命名空间详解)

    ① 命名空间作用域是对标识符的名称本地化,避免命名冲突。

    ② 定义命名空间:

namespace myNamespace
{
int i;
class myClass
{
int a;
}
}

    ③ 使用命名空间方法:

A:

myNamespace::i = ;
myNamespace::myClass obj;
obj.a = ;//这里不用写myNamespace::myClass了

B:

using namespace myNamespace;
i = ;
//就不用写myNamespace::i了,myNamespace里所有都暴露了

    ④ 命名空间可以嵌套

    ⑤ 静态变量作用域为本文件内。生存期和程序一样

    ⑥ 具有命名空间作用域的变量也成为全局变量

using namespace myNamespace;
i = ;
//就不用写myNamespace::i了,myNamespace里所有都暴露了

2. 对象生存期

  2.1 静态生存期

    (1) 静态生存期与程序运行期相同。

    (2) 命名空间作用域中声明的对象都具有静态生存期

    (3) 如果在函数内部的局部作用域中声明的话需要用static

    (4) 静态作用域中的静态变量特点是:不会随着函数的每次调用而产生一个副本

  2.2 动态生存期

    (1) 在局部声明的也叫局部生存期,诞生于声明点,结束于声明所在的块执行完毕

3. 类的静态数据成员

  3.1 类的静态数据成员不属于某个类的对象,而属于这个类,采用static关键字声明。静态成员在每个类中都只有一个副本,由所有的对象共同维护和使用,实现了一个类不同对象之间的共享。用法: 类名::标识符

  3.2 静态数据成员具有静态生存期。

  3.3 用法:在类内部声明,在类的外部定义,如:

class point{
private:
static int count;//声明
};
int point::count = ;//定义

  3.4 静态函数成员

    (1) 也被一个类的各个对象共有

    (2) 调用方式:

      ① 类名::函数名(推荐)

      ② 对象名.函数名

    (3) 静态成员函数可以直接访问该类的静态数据和成员函数。而访问非静态成员,必须通过对象名

class A{
public:
static void f(A a);
private:
int x;
static int y;
}; void A::f(A a)
{
cout<<x; //错误
cout<<a.x;//正确,但不推荐
cout<<y;//正确
}

4. 类的友元

  友元关系提供了不同类或对象的成员函数等的数据共享机制。友元就是声明哪些类或者函数是自己的朋友,并且提供这些函数访问自己的数据的权利。

  4.1 友元函数

  (1) 友元函数是在类中用关键字friend修饰的非成员函数。这个函数可以是普通的函数也可以是其他类的成员函数。声明后,这个函数可以访问本类的私有和保护成员。

  (2) 用法:

class point{
private:
int x, y;
public:
friend float dist(point &p1, point &p2);//声明
} float dist(point &p1, point &p2){
p1.x + p2.x;//可以直接使用私有成员
}

  4.2 友元类

  (1) 如果A类为B类的友元类,则A的所有成员函数都可以访问B的所有成员。

  (2) 用法:

class B
{
private:
int x;
friend class A;
}; class A
{
void function(B &b){
cout<<b.x<<endl;//可以直接访问
}

  (3) 注意:

    ① 友元关系不能传递

    ② 友元关系是单向的

    ③ 友元关系是不能继承的

5. 共享数据的保护

  5.1 常对象

  (1) 常对象必须进行初始化,并且不能被更新。

  (2) 用法:

    const 类型说明符 对象名

  5.2 用const修饰的类成员

  (1) 常成员函数

    ① 用法:

      类型说明符 函数名(参数) const;

class A{
void function() const;
} void A::function() const{
...
}

  (2) 常数据成员

    ① 类的const对象只能用初始化参数列表进行初始化

  5.3 常引用

  (1) 用法:

    const 类型说明符 &引用名

  (2) 非const引用只能绑定到普通对象,而不能绑定到常对象,但常引用既可以绑定到常引用又能绑定到普通引用。但是绑定到普通引用的时候,在用的时候不能对这个普通对象进行修改。对于类类型的普通对象常引用,既不能修改数据成员,又不能调用它的非const成员函数。

  (3) 对于在函数中无需改变其值的参数,不宜使用普通引用的方式传递,因为那会使得常对象无法被传入,采用值传递的方式或者传递引用可以解决这个问题,但是值传递有时比较慢,所以推荐采用常引用传递。

作者:viczzx 出处:http://www.cnblogs.com/zixuan-zhang 欢迎转载,也请保留这段声明。谢谢!

C/C++基础知识总结——数据的共享与保护的更多相关文章

  1. 我的C++笔记(数据的共享与保护)

    *数据的共享与保护: * .作用域: * 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用域(块作用域).类作用域和命名空间作用域. * ().函数原型作用域 ...

  2. 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化

    引言 今天周末,我在家坐着掐指一算,马上又要到一年一度的金九银十招聘季了,国内今年上半年受到 YQ 冲击,金三银四泡汤了,这就直接导致很多今年毕业的同学会和明年毕业的同学一起参加今年下半年的秋招,这个 ...

  3. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

  4. Spring MVC基础知识整理➣数据校验与格式化

    概述 将view中Form的数据提交到后台之后,后台如何验证数据的有效性?在这里Spring MVC提供了相应的Hibernate类包(hibernate-validator-4.3.1.Final. ...

  5. Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

    上一节学习了使用SQLiteDatabase来操作SQLite数据库的方法,接下来我们开始接触第一个开源库:LitePal.LitePal是一款开源的Android数据库框架,它采用了对象关系映射(O ...

  6. Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储

    前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...

  7. Android学习之基础知识九—数据存储(持久化技术)

    数据持久化是将那些内存中的瞬时数据保存到存储设备,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. Android系统中主要提供了3种方式用于简单地实现数据持久化功能:文件存储.SharedP ...

  8. MySQL基础知识 数据库 数据表

    1.数据库结构 库 表 数据 2. sql(structured query language)结构化查询语言 管理数据库 管理表 管理数据 3.数据库 增删改查 增 create database  ...

  9. python 爬虫与数据可视化--python基础知识

    摘要:偶然机会接触到python语音,感觉语法简单.功能强大,刚好朋友分享了一个网课<python 爬虫与数据可视化>,于是在工作与闲暇时间学习起来,并做如下课程笔记整理,整体大概分为4个 ...

随机推荐

  1. Eddy's mistakes(字母大小写转换)strlwr函数的应用

    Problem Description Eddy usually writes  articles ,but he likes mixing the English letter uses, for ...

  2. 学SpringMVC

    http://jinnianshilongnian.iteye.com/blog/1593441

  3. set RowCount 与 top n

    有时,采用top n中间n它是一个变量,这将需要使用()去完成: declare @count1 int set @count1 = 8 select top <strong>(@coun ...

  4. FindBugs:Compiler output path for module can not be null. check your module/project settings问题原因

    这可能是很多人在使用Android studio 该插件会发现此错误信息:Compiler output path for module can not be null. check your mod ...

  5. 合并多段zip文件并解压缩

    cat xxx.zip.*** >xxx.zip unzip xxx.zip

  6. C++外观设计模式模式(三)

    3.外观模式总结 引入了外观类.解除了客户类与子系统的耦合性.客户类不须要直接操作子系统,而是由外观类负责处理,对client而言是透明的,客户类仅仅须要操作外观类就能够了,符合"迪迷特法则 ...

  7. BZOJ 1208 HNOI2004 宠物收容所 平衡树/set

    标题效果:有一个宠物收容所.目前还没有被采纳的宠物或谁想要领养宠物,每个宠物有个性值,大家谁想要领养宠物具有理想人格值.每一刻,宠物收容所只是为了有谁想要领养宠物或宠物的人. 当领走宠物,将有一定程度 ...

  8. PAT 1006. Sign In and Sign Out

    #include<iostream> #include<string> using namespace std; int main(){ int cnt;cin>> ...

  9. YII相关资料(干货)

    Sites 网站 yiifeed:Yii 最新动态都在这里 yiigist:Yii 专用的 Packages my-yii:Yii 学习资料和新闻 Docs 文档 Yii Framework 2.0 ...

  10. Model和Entity Framework

    Model和Entity Framework 上一节:ASP.NET MVC 5 入门教程 (4) View和ViewBag 下一节:ASP.NET MVC5 + EF6 入门教程 (6) View中 ...