当前位置: 首页 > 编程日记 > 正文

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

*数据的共享与保护:
* 1.作用域:
* 作用域是一个标识符在程序正文中有效的区域。C++中标识符的作用域有函数原型作用域、局部作用域(块作用域)、类作用域和命名空间作用域。
* (1).函数原型作用域:
* 函数原型作用域是C++中最小的作用域,在函数原型中一定要包含形参的类型说明。在函数原型声明时形式参数的作用范围就是函数原型的作用域。如:double area(double radius);标识符radius的作用范围就在函数area形参列表的括号之间。
* 由于在函数原型的形参列表中起作用的只是形参类型,标识符并不起作用,因此在程序中是允许省去的,但是为了程序的可读性,通常还是要在函数原型声明时给出形参标识符。
* (2).局部作用域:
* 函数形参列表中形参的作用域,从形参列表中的声明处开始,到整个函数体结束为止;函数体内声明的变量,其作用域从声明处开始,一直到声明所在块结束的大括号为止;具有局部作用域的变量也称为局部变量。
* (3).类作用域:
* 类可以看作是一组有名成员的集合,类x的成员m具有类作用域,对m的访问方式有3中:如果在x的成员函数中没有声明同名的局部作用域的标识符,那么在该函数内可以直接访问成员m;通过表达式x.m或者x::m。即程序中访问对象成员的最基本方法;通过ptr->m这样的表达式,其中ptr为指向x类的一个对象的指针。
* (4).命名空间作用域:
* 一个大型的程序通常有不同模块构成,不同的模块有可能有不同人员开发的。不同模块中的类和函数之间可能发生重名。命名空间就会消除这些错误。语法结构:
* namespace 命名空间名{
* //命名空间内的各种声明(函数声明、类声明、。。。);
* }
* 一个命名空间确定了一个命名空间作用域,凡是在该命名空间之内声明的、不属于前面所说各个作用域的标识符,都属于该命名空间作用域。在命名空间内部可以直接引用当前命名空间中声明的标识符,如果需要引用其他命名空间的标识符,需要使用下面语法:
* 命名空间::标识符
*
* namespace someNs{
* class SomeClass{...};
* };
* 如果要引用类名SomeClass或函数名SomeFunc,需要使用下面的方式:
* someNs::SomeClass obj;
* 有时,在标识符前面总使用这样的命名空间限定会显得过于冗长,为了解决这个问题,C++又提供了using 语句,using语句有两种:
* using 命名空间::标识符;
* using namespace 命名空间名;
* 命名空间也允许嵌套:
* namespace OuterNs{
* namespace InnerNs{
* class SomeClass{...};
* }
* }
* 引用其中的SomeClass类,需要使用OuterNs::InnerNs::SomeClass的语法;
* 此外,还有两种比较特殊的命名空间:
* 全局命名空间和匿名命名空间。全局命名空间是默认的命名空间,在显示声明的命名空间之外声明的标识符都在一个全局命名空间中,匿名命名空间是在一个需要显示声明的没有名字的命名空间。声明如下:
* namespace{
* 匿名命名空间内的各种声明(函数声明、类声明、...);
* }
* 具有命名空间作用域的变量又称为全局变量;
*
* 2.对象的生存期:
* (1).静态生存期:
* 如果对象的生存期与程序的运行期相同,则称它具有静态生存期;在命名空间作用域中声明的对象都是具有静态生存期的。如果在函数内部的局部作用域中声明具有静态生存期的对象,则要使用关键字static。如:static int i;
* 局部作用域中的静态变量的额特点是:它并不随着每次函数调用而产生副本,也不会随着函数返回而失效。也就是说当一个函数返回后,下一个再调用时,该变量还是上一次的值。即使发生递归调用也不会为该变量建立新的副本,该变量会在每次调用间共享。
* (2).动态生存期:
* 局部生存期对象诞生于声明点,结束声明所在的执行完毕之时。类成员对象也有自己的生存期。不用static修饰的成员对象其生存期都与它们所属对象的生存期保持一致。
*
* 3.类的静态成员:
* 在结构化程序设计中程序模块的基本单位是函数,因此模块间对内存中数据的共享是通过函数与函数之间的数据共享来实现的,其中包括两个途径:参数传递和全局变量。
* (1).静态数据成员:
* 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明一个静态成员。静态成员在每个类只有一个副本,由该类所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的静态数据成员具有静态生存期。由于静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问,一般用的语法是:
* 类名::标识符;
*
* (2).静态函数成员:
* 静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态成员,必须通过对象名。
*class A{
public:
static void f(A a);
private :
int x;
};
void A::f(A a){
cout<<x;// This is WRONG!
cout<<a.x;//之所以在静态成员函数中访问类的非静态成员需要指明对象是因为对静态成员函数的调用是没有目的对象的,因此不能像非静态成员函数那样隐含地通过目的对象访问类的非静态成员。

}
*
* 4.类的友元:
* 友元关系提供了不同类或对象的成员函数之间、类的成元函数与一般函数之间的关系进行数据共享的机制。通俗的说,就是一个类主动声明哪些其他类或函数是它的友员,今儿给它们提供对本类的访问特许。通过友元关系一个普通函数或者类的成员函数可以访问封装与另一个类中的数据。从一定程度上讲,与友元关系是对数据隐蔽和封装的破坏。
* 在一个类中可以利用关键字friend将其他函数或类生命为友元。如果友元是一般函数或类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有函数都自动成为友元函数。
* (1).友元函数在类中用关键词friend修饰的非成员函数。友元函数可以使一个普通函数也可以是其他类的成员函数。
* #include "iostream"
#include "cmath"
using namespace std;
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 &p1,Point &p2);//友元函数声明;
private:
int x,y;
};
//友元函数dist的定义
float dist(Point &p1,Point &p2){
double x=p1.x-p2.x;
double y=p1.y-p2.y;
return static_cast<float>(sqrt(x*x+y*y));
}
int main(){
Point myP1(1,1),myP2(4,3);
cout<<"The distance is:";
cout<<dist(myP1,myP2)<<endl;
return 0;
}
* 在Point类中只声明友元函数的原型,友元函数dist的定义在类外,可以看出友元函数通过对象名直接访问了Point类的x和y属性。
*
* (2).友元类:
* 若类A为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
* class B{
* friend class A;//声明A为B的友元类。
* };
* 声明友元类是建立在类与类之间的练习,实现类与类之间数据的共享的一种途径。
* #include <iostream>
using namespace std;
class A{
public:
void display(){cout<<x<<endl;}
int getX(){return x;}
friend class B;
private:
int x;};
class B{
public :
void set(int i);
void display();
private:
A a;
};
void B::set(int i){
a.x=i;//因为B是A的友元,所以在B的成员函数中可以访问A类的所有私有成员;
}
*
* 注:友元关系是不能传递的,B是A的友元,C是B的友元,如果没有声明C是A的友元就没有友元关系。友元关系是单向的,如果B是A的友元,B可以访问A的私有数据和保护数据,但A的成员函数不能访问B的私有和保护数据。友元关系是不能被继承的,如果B是A的友元,B的派生类不能自动的成为A的友元。
*
* 5.共享数据的保护:
* (1).常对象:
* 常对象的数据成员值在对象的整个生存期内不能被改变。也就是说常对象必须进行初始化,而且不能被更新。
* const 类型说明符 对象名;
* class A{
public:
A(int i,int j):x(i),y(j){};
private :
int x,y;
};
const A a(3,4);//a是常对象,不能被更新。
*
* (2).const 修饰的类成员:
* 常用成员函数:使用const关键字修饰的函数为常成员函数,声明格式:
* 类型说明符 函数名(参数表) const;
* 如果将一个对象设置为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数;
* const关键字可以用于对重载函数的区分,void print(); void print() const;
* 常数据成员:使用const说明的数据成员为常数据成员,如果在一个类中说明了一个常数据成员,那么在任何函数中都不能对该常数据成员赋值。
* #include <iostream>
using namespace std;
class A{
public:
A(int i);
void print();
private:
const int a;
static const int b;
};
const int A::b=10;//静态常数据成员在类外说明和初始化;
A::A(int i):a(i){}//常数据成员只能通过初始化列表来获取初值;
void A::print(){cout<<a<<":"<<b<<endl;}
int main(){
A a(100),a2(3);
a.print();
a2.print();
return 0;
}
*
* 常引用:
* 如果在申明引用时用const修饰,被申明的引用就是常引用,常引用所引用的对象不能被更新。如果常引用作为形参,便不会发生对实参的更改。
* const 类型说明符 &引用名;
* 非const的引用只能绑定到普通的对象,而不能绑定到常对象,但常引用可以绑定到常对象。一个常引用,无论是绑定到一个普通对象还是常对象,通过该引用访问该对象时,只能把该对象当作常对象。这意味着对于基本数据类型的引用,则不能为数据赋值,对于类类型的引用,则不能修改它的数据成员,也不能调用它的非const的成员函数。
*
* 6.C++多文件结构和编译预处理命令:
* (1).C++的一般结构:
* 在多个文件结构中,#include指令的作用是将指定的文件嵌入到当前源文件中,这个被嵌入的文件可以使cpp文件,也可以是h文件。指令include有两种写法:#include<文件名>表示按照标准方式搜索要嵌入的文件,该文件位于编译器环境的include子目录下,一般嵌入系统提供的标准文件时采用的方式。另一种就是#include"文件名"表示首先在当前目录下搜索要嵌入 的文件,如果没有再按照标准方式搜索。
* (2).外部变量:
* 外部变量可以在源文件中可以使用,还可以被其他文件使用。 命名空间作用域中定义的变量,默认情况下都是外部变量,但在其他文件中如果需要使用这一变量,需要用extern关键字加以声明。
* (3).外部函数:
* 在所有类之外声明的函数(非成员函数),都是具有命名空间作用域的,如果没有特殊说明,这样的函数都可以在不同的编译单元中被调用,只要在调用之前进行引用性声明。也可以在声明函数原型或定义函数时用extern修饰。
*
* 7.标准C++库:
* C++的库中保留了大部分C语言系统函数和另外预定义的模板和类。使用标准C++库时,还需要加入下面一条语句来将指定命名空间中的名称引入到当前作用域中:
* using namespace std;
* 如果不使用using namespace std,就需要在使用std命名空间中的标识符时冠以命名空间名std::;
* (1).编译预处理:
* #include指令:
* 文件包含指令,起作用是将另一个源文件嵌入到当前源文件中该点处,通常用#include指令来嵌入头文件。
* #define和#undef指令:
* #define曾经在C程序中被广泛使用,但#define能完成的一些功能,能够被C++引入的一些语言特性很好的代替。在C语言中用#define来定义符号常量,如:#define PI 3.14;在C++中也同样定义符号常量,但是更好地方法是在类型说明语句中用const修饰。#undef的作用是删除由#define定义的宏,使之不再起作用。
* 条件编译指令:
* #if 常量表达式 或 #ifdef 标识符 或 #ifndef 标识符
* 程序段;
* #elif
* 程序段;
* #else
* 程序段;
* #endif
* */

转载于:https://www.cnblogs.com/feiruo/p/4678846.html

相关文章:

最新Java中Date类型详解

一、Date类型的初始化 1、 Date(int year, int month, int date); 直接写入年份是得不到正确的结果的。 因为java中Date是从1900年开始算的&#xff0c;所以前面的第一个参数只要填入从1900年后过了多少年就是你想要得到的年份。 月需要减1&#xff0c;日可以直接插入。 这种方…

ES6 常用的特性整理

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 1.默认参数 2.模板对象-反引号 3.多行字符串-反引号 4.解构赋值-对象&#xff0c;数组 5.增强的对象字面量- 直接给对象里面的属性赋值给变量 6.给对象的属性赋值的时候可以直接给一个参数&#xf…

crontab 最小间隔_今天我间隔了:如何找到不在数组中的最小数字

crontab 最小间隔by Marin Abernethy通过Marin Abernethy 今天我间隔了&#xff1a;如何找到不在数组中的最小数字 (Today I Spaced: how to find the smallest number that is not in the array) TIS在我的第一次技术采访中。 这是我学到的。 (TIS in my first technical int…

计算起点地址和终点地址的最短驾车距离和驾车时间

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 需求&#xff1a; 在一个excel的xlsx表格中有很多起点的地址和终点的地址&#xff0c;要批量计算两个地址之间的距离和驾车时间&#xff0c;按照百度地图的最短距离计算。最后把得出的行驶距离和驾车时…

jmeter测试工具

jmeter的下载&#xff1a; http://jmeter.apache.org/download_jmeter.cgi 1.打开链接选择 Binaries 下.zip下载 下载完后解压 2.然后再下载java中jdk, 配置java的环境变量 JAVA_HOME 和path JAVA_HOME值中加jdk的安装目录 path后面加;%JAVA_HOME%\bin; 3.在jmeter解压目录中…

余数定理_如何用Java实现余数定理

余数定理by Anuj Pahade由Anuj Pahade 如何用Java实现余数定理 (How to implement the Chinese Remainder Theorem in Java) This post assumes that you know what Chinese Remainder Theorem (CRT) is and focuses on its implementation in Java. If you don’t, I’d reco…

C#如何根据DataTable生成泛型List或者动态类型list

背景&#xff1a;在项目中&#xff0c;sql语句检索返回DataTable&#xff0c;然后根据检索结果做进一步的操作&#xff0c;本篇文章即是介绍如何将DataTable快速生成泛型List返回。 假设存在如下学生类&#xff1a; 1 public class student 2 { 3 public int I…

Easyui combobox下拉框默认选中第一项

var val $(#cc).combobox("getData");for (var item in val[0]) { if (item "groupName") { $(this).combobox("select", val[0][item]); }}转载于:https://www.cnblogs.com/AmbiguousMiao/p/7094589.html

js 获取当前时间 随记

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 获取当前时间 new Date().toTimeString().split( )[0];console.log(dete, date) //dete 11:39:46

使用Typescript的巧妙React上下文技巧-不是Redux

by Bill Girten比尔吉尔滕(Bill Girten) 使用Typescript的巧妙React上下文技巧- 不是 Redux (Clever React context tricks using Typescript — not Redux) by Bill Girten, Martin Maza, and Alison Stuart由Bill Girten &#xff0c;Martin Maza和Alison Stuart 撰写 TLDR…

vagrant 介绍,安装与使用

可以帮你统一团队成员的开发环境。如果你或者你的伙伴创建了一个Vagrantfile&#xff0c;那么你只需要执行vagrant up就行了&#xff0c;所有的软件都会安装并且配置好。团队成员可以通过相同的Vagrantfile来创建他们的开发环境&#xff0c;无论他们是在Linux, Mac OS X, 或者W…

HTML元素的基本特性

1&#xff0c;Disabled 特性&#xff1a; 1 //Disabled 设置元素不可用&#xff1a; 2 3 $(this).attr("disabled","disabled") 4 5 //移除push元素的diasble特性&#xff1a; 6 7 $("#push").removeAttr(disabled) 2&#xff0c;z-index 特性…

js base64 解码

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 解码函数 function base64_decode (input) { // 解码&#xff0c;配合decodeURIComponent使用var base64EncodeChars "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/";…

esl8266开发之旅_从ESL老师到越南软件开发人员的旅程

esl8266开发之旅by alberto montalesi通过阿尔贝托蒙塔莱西 从ESL老师到越南软件开发人员的旅程 (My Journey from an ESL Teacher to Software Developer in Vietnam) 介绍 (Introduction) Hi, my name is Alberto, and this is the story of how I learned to code, wrote a…

洛谷P2429 制杖题 [2017年6月计划 数论10]

P2429 制杖题 题目描述 求不大于 m 的、 质因数集与给定质数集有交集的自然数之和。 输入输出格式 输入格式&#xff1a;第一行二个整数 n&#xff0c;m。 第二行 n 个整数&#xff0c;表示质数集内的元素 p[i]。 输出格式&#xff1a;一个整数&#xff0c;表示答案&#xff0c…

微信小程序框架封装登录,网络请求等公共模块及调用示例

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 这个公共模块封装了session的获取&#xff0c;和fromId发送&#xff0c;showToast成功和失败的弹窗。 微信小程序公共通用模块 const util require(../utils/util.js);function init() {var that th…

安装centos后无法引导启动windows7的解决方法

在电脑Windows7系统上安装Centos7&#xff0c;安装后找不到Windows7引导菜单。 原因&#xff1a;因为CentOS 7已采用新式的grub2系统&#xff0c;所以需要进入/boot/grub2目录后使用vi编辑grub.cfg文件。 解决方法一&#xff1a;修改Centos 7的Grub2引导&#xff0c;添加Window…

git最佳实践_Git最佳实践如何为我节省大量的返工时间

git最佳实践by Hemal Patel通过赫马尔帕特尔 Git最佳实践如何为我节省大量的返工时间 (How Git best practices saved me hours of rework) Recently I was working on the task to upgrade a certificate for a NodeJS application. This was last touched two years ago for…

商品列表选择尺寸和颜色高亮,并且把选择的数据传递到下一个页面

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 需求&#xff1a;商品列表选择属性&#xff0c;给中的属性显示高亮&#xff0c;并且把选择的数据记录下来传递到下一个页面。 项目下载地址&#xff1a;点击去下载 效果图&#xff1a; 选择商品的属性…

Android studio 使用心得(三)—从Eclipse迁移到Android studio

断断续续的也算是把eclipse上的代码成功迁移到android studio上来了&#xff0c;现在&#xff0c;我同事继续用eclipse&#xff0c;我用android studio&#xff0c;svn上还是之前eclipse的项目&#xff0c;迁移成功后&#xff0c;我也能happy的开发了,两不误.直接来分享我捉摸的…

代码改变世界_改变世界,一次只写一行代码

代码改变世界People like to look at changing the world as a big task. I believe changing the world can be done in little steps.人们喜欢将改变世界视为一项艰巨的任务。 我相信&#xff0c;改变世界可以一步步完成。 The key is identifying a problem and taking a l…

14_传智播客iOS视频教程_instancetype

12312312转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/7097094.html

HDU 1011-Starship Troopers(树形背包)

题意&#xff1a; 有n个洞&#xff0c;连接像一棵树&#xff0c;每个包含一定数量的怪和价值&#xff0c;给你m个士兵&#xff0c;每个士兵能打20个怪&#xff0c;杀完一个洞的怪可得该洞的价值才可继续打相连的下面的洞&#xff08;每个士兵只能打一个洞&#xff09;&#xff…

微信小程序自定义组件之Picker组件

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 需求&#xff1a; 通过JS条件判断&#xff0c;满足条件就弹出Picker给用户选择一个数组里面的数据。 有些朋友可能会有疑问&#xff1a; 1.为什么要使用自定义的Picker组件&#xff0c;不是有原生的组…

kotlin ++ --_顺便说一句-探索Kotlin代表团

kotlin --by Adam Arold亚当阿罗德(Adam Arold) 顺便说一句-探索Kotlin代表团 (By the way — exploring delegation in Kotlin) Kotlin has an interesting keyword, by, which can be used for delegation. There is a lot of confusion around it, so in this article we’…

网页制作之html基础学习3-css样式表

样式&#xff1a;CSS&#xff08;Cascading Style Sheets,层叠样式表&#xff09;&#xff0c;作用是美化HTML网页。 在样式里面用 /* */ 进行注释。 1、样式表的基本概念 1.1、样式表分类 1、内联样式表 和html联合显示&#xff0c;控制精确&#xff0c;但是可重用性差&#…

Mac OS X 下查看和设置JAVA_HOME

原文链接 : http://blog.csdn.net/done58/article/details/51138057 1, 查看Java版本 打开Mac电脑&#xff0c;查看JAVA版本&#xff0c;打开终端Terminal&#xff0c;通过命令行查看笔者的java版本&#xff1a;&#xff1a; [html] view plaincopy bogon:~ donny$ java -vers…

微信小程序获取用户设备的信息

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 可以获取用户的手机型号&#xff0c;手机操作系统&#xff0c;微信版本&#xff0c;屏幕宽高等等。 Object wx.getSystemInfoSync() wx.getSystemInfo 的同步版本 返回值 Object res 属性类型说明最…

php 命令执行crud_如何使用原始JavaScript执行CRUD操作

php 命令执行crudby Zafar Saleem通过Zafar Saleem 如何使用原始JavaScript执行CRUD操作 (How to perform CRUD operations using vanilla JavaScript) Nowadays there are a number of JavaScript frameworks around such as React, Angular, Vue and so on. They all offer …

关于手机系统信息的总结

获取IMEI号: /*** 获取IMEI号* * Description:* param param activity* param return* return String*/public static String getIMEI(Activity activity) {TelephonyManager manager (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE);return manage…