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. Session与Caching

    Session与Caching 在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于System.Web.dll库了,所以相应的,Session也就成了A ...

  2. C++拷贝构造函数具体解释

    一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是非常easy的,比如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各 ...

  3. ProgressDialog(四)——更改系统自带ProgressDialog文字大小

    MainActivity如下面: package com.example.ttt; import android.app.Activity; import android.app.ProgressDi ...

  4. linux_ubuntu12.04 卸载和安装mysql、远程访问、not allowed

    一: 安装mysql 卸载mysql 第一步 sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-se ...

  5. 了解了解你自己的话zookeeper(从那时起,纠正了一些说法在线)

    1,先看看官方的定义吧: ZooKeeper is a distributed, open-source coordination service for distributed applicatio ...

  6. BAT 特殊符号总结

    原文:BAT 特殊符号总结 BAT特殊符号总结,用好特殊符号,利用提高开发效率.^ 转义符 用在特殊符号之前 比如: echo 非常^&批处理 如果不加^ 那么"批处理"将 ...

  7. 分布式服务弹性框架“Hystrix”实践与源码研究(一)

    文章初衷 为了应对将来在线(特别是无线端)业务量的成倍增长,后端服务的分布式化程度需要不断提高,对于服务的延迟和容错管理将面临更大挑战,公司框架和开源团队选择内部推广Netflix的Hystrix,一 ...

  8. asp.net 获得客户端 mac 地址

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. Spark Standalone模式应用程序开发

    作者:过往记忆 | 新浪微博:左手牵右手TEL | 能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明博客地址:http://www.iteblog.com/文章标题:<Spar ...

  10. typeof小结