C++对C语言的非面向对象特性扩充(3)
今天要讲的是C++作用域运算符"::",强制类型转换的扩充,C++中相对于C中malloc和free函数的运算符new和delete,以及C++对C的一个重要扩充:引用(reference);这也是C++对C语言的非面向对象特性扩充系列的最后一节。
1.如果有两个同名变量,一个是全局的,一个是局部的,那么局部的变量在其作用域拥有较高的优先权,全局变量则被屏蔽。那如果我希望在局部变量的作用域里使用全局变量怎么办,这时就要用到::作用域运算符了。比如:
1 #include<iostream>
2
3 usingnamespace std;
4
5 int x;
6
7 int main()
8
9 {
10
11 int x;
12
13 x=50;
14
15 ::x=100;
16
17 cout<<"局部变量x="<<x<<endl;
18
19 cout<<"全局变量x="<<::x<<endl;
20
21 return0;
22
23 }
结果:

2.在C语言中有强制类型的转换比如:int x=1;double y=(double)x;而C++不但支持这种格式,还提供了一种类似于函数格式的转换:int x=1;double y=double(x);
3.C中的malloc和free函数被用于动态分配内存和释放动态分配的内存,而在C++里,不但保留了这两个函数,另外使用运算符new和delete来更好地进行内存的分配和释放。内存分配的基本形式:指针变量名=new 类型,如:int *x;x=new int;或char *chr;chr=new char;释放内存(delete 指针变量名):delete x;delete chr;虽然new和delete的功能和malloc和free相似,但是前者有几个优点:(1)new可以根据数据类型自动计算所要分配的内存大小,而malloc必须使用sizeof函数来计算所需要的字节;(2)new能够自动返回正确类型的指针,而malloc的返回值一律为void*,必须在程序中进行强制类型转换;
new可以为数组动态分配内存空间如:int *array=new int[10]或int *xyz=new int[8][9][10];释放时用delete []array和delete []xyz;另外new可以在给简单变量分配内存的同时初始化,比如int *x=new int(100);但不
能对数据进行初始化;有时候没有足够的内存满足分配要求,则有些编译系统将会返回空指针NULL,比如:
1 #include <iostream>
2
3 usingnamespace std;
4 int main()
5 {
6 int*x;
7 x=newint;
8 if(!x)
9 {
10 cout<<"分配内存失败!"<<endl;
11 return1;
12 }
13 *x=10;
14 cout<<*x;
15 delete x;
16 return0;
17 }
4.接下来详细地说一下C++的引用(reference),先解释一下,什么是引用?打个比方,一个人可能有三四个名字,但这三四个名字所做的事,其实就是那一个人所做的。引用就是给变量起了个别名罢了。它的格式:类型 &引用名=以定义的变量名;比如:
1 #include <iostream>
2
3 usingnamespace std;
4 int main()
5 {
6 int x=100;
7 int&y=x;
8 x=50;
9 cout<<"x="<<x<<endl;
10 cout<<"y="<<y<<endl;
11
12 y=0;
13 cout<<"x="<<x<<endl;
14 cout<<"y="<<y<<endl;
15
16 return0;
17 }
结果:

实际上,引用与其所代表的变量共享同一个内存单元,系统部位引用另外分配存储空间,编译系统使引用和其代表的变量具有相同地址。
1 #include <iostream>
2
3 usingnamespace std;
4 int main()
5 {
6 int x=100;
7 int&y=x;
8 x=50;
9 cout<<"变量x的地址:"<<&x<<endl;
10 cout<<"引用y的地址:"<<&y<<endl;
11 return0;
12 }
结果:

发现其实引用就那么回事,但是也有几个注意点:(1)在声明引用时,必须立即对它进行初始化,不能声明完后在赋值:如int x=10;int &y;y=x;(2)引用的类型必须和给其赋值的变量的类型相同,不可以这样:int x;double &y=x;(3)为引用提供的值,可以是变量也可以是引用:int x=5;int &y=x;int &z=y;(4)引用在初始化后不能再被重新声明为另一个变量的引用:int x,y;int &z=x;z=&y;
其实引用主要的用途就在于作为函数的参数,回顾一下,以前在C中传递函数参数有两种情况,分别是"传值调用"和"传址调用",前者传递是单向的,后者则为双向,而引用作为函数参数传递,则是"传址调用",它和C中指针作为参数传递的效果是一致的,只不过它不用像指针一样,需要交间接引用运算符"*";举个例子,比较一下这两种方法:
1 #include <iostream>
2
3 usingnamespace std;
4 void swap(int*x,int*y)
5 {
6 int temp;
7 temp=*x;
8 *x=*y;
9 *y=temp;
10 }
11
12 void swap(int&x,int&y)
13 {
14 int temp;
15 temp=x;
16 x=y;
17 y=temp;
18 }
19 int main()
20 {
21 int i=10,j=5;
22 cout<<"i="<<i<<" j="<<j<<endl;
23 swap(&i,&j);
24 cout<<"i="<<i<<" j="<<j<<endl;
25 swap(i,j);
26 cout<<"i="<<i<<" j="<<j<<endl;
27 return0;
28 }
结果:

对于引用,还有点小小的细节要说一下:(1)不能建立引用数组,比如:int a[4]="abcd";int &araay[4]=a;(2)不能建立引用的引用,不能建立指向引用的指针,比如:int x=50;int &&y=x;int &z=x;int *p=z;(3)可以把引用的地址赋给指针;(4)可以用const对引用加以限定,不允许改变引用的值,比如:int x=10;const int &t=x;t=5,但是x=5却可以,此时x和t都等于5;(5)引用运算符和地址操作符虽然都是&,但是引用的话,只是在声明时才用,而其它场合使用&都是地址操作符!比如:int x=5;int &y=x;y=10;int *z=&y//&为地址操作符;cout<<&z//&为地址操作符;
最后,我们还是用一个例子来总结一下今天所讲的内容(开发工具:vs2010):
1 #include "stdafx.h"
2 #include <iostream>
3
4 usingnamespace std;
5
6 int x=10;//全局变量
7 void swap(int*x,int*y)//指针类型的参数
8 {
9 int temp;
10 temp=*x;
11 *x=*y;
12 *y=temp;
13 }
14
15 void swap(int&x,int&y)//带有引用类型的参数
16 {
17 int temp;
18 temp=x;
19 x=y;
20 y=temp;
21 }
22 int main()
23 {
24 double*y=newdouble(5.55);//new动态分配内存空间,字节大小和double类型所占字节一样,并初始化值
25 int x=double(*y);//强制类型转换
26
27 cout<<"局部变量x="<<x<<" 全局变量x="<<::x<<endl;
28 swap(&x,&::x);
29 cout<<"局部变量x="<<x<<" 全局变量x="<<::x<<endl;
30 swap(x,::x);
31 cout<<"局部变量x="<<x<<" 全局变量x="<<::x<<endl;
32
33 delete y;//释放内存空间
34 return0;
35 }
结果:
 
C++对C语言的非面向对象特性扩充(3)的更多相关文章
- C++对C语言的非面向对象特性扩充(1)
		
我将分3篇来介绍C++相对于C在非对象特性上的扩充,今天要讲的是C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较. 1.C++注释除了包括原有C的块注释/* ...
 - C++对C语言的非面向对象特性扩充(2)
		
上一篇随笔写了关于C++在注释,输入输出,局部变量说明的扩充,以及const修饰符与C中的#define的比较,也得到了几位学习C++朋友们的帮助讲解,十分感谢,我也希望欢迎有更多学习C++的朋友一起 ...
 - Java语言中的面向对象特性总结
		
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
 - Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
		
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
 - Java语言中的面向对象特性
		
面向对象的基本特征 1.封装性 封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: ◇ 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位( ...
 - javascript进阶——面向对象特性
		
面向对象的javascript是这门语言被设计出来时就考虑的问题,熟悉OOP编程的概念后,学习不同的语言都会发现不同语言的实现是不同的,javascript的面向对象特性与其他具有面向对象特性的语言的 ...
 - Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
		
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
 - java安全沙箱(三)之内置于Java虚拟机(及语言)的安全特性
		
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...
 - 浅谈Objective—C中的面向对象特性
		
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
 
随机推荐
- 剑指offer——从尾到头打印链表节点的值
			
输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总 ...
 - 投资新兴市场和细分市场 good
			
新兴市场对程序员来说,就是一种新的语言.一个新的平台.一套新的框架.新兴市场因为刚刚兴起,所以几乎所有人都在同一个起跑线,特别适合后进者.我认识从一个2011年开始学习iOS开发的同学,他能能力中等, ...
 - HDU 5787 K-wolf Number(数位DP)
			
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5787 [题目大意] 求区间[L,R]内十进制数相邻k位之间不相同的数字的个数. [题解] 很显然的 ...
 - 链表插入排序(insertion-sort-list)
			
自己写的代码有几个比较大的用例一直过不去,网上的代码大部分有问题,思路是先将链表置空表,再将链表中的元素循环插入到指定位置. 下面是一份正确的代码,但是是带头节点的链表: void Insertsor ...
 - Mysql文件太大导入失败解决办法总结
			
Mysql文件太大导入失败解决办法总结 在使用phpmyadmin导入数据库的时候可能会碰到由于数据库文件太大而无法导入的问题! 英文提示如下:File exceeds the maximum all ...
 - Cocos2d-x lua游戏开发之安装Lua到mac系统
			
注意:mac ox .lua version :5.15 下载lua官网的lua, 注意:最好是5.15下面.5.2的lua不支持table的getn()方法,这让我情何以堪.(获取table长度.相 ...
 - Javascript对象的声明
			
JavaScript 对象 对象由花括号分隔.在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义.属性由逗号分隔: var person={firstname:" ...
 - $timeout, $interval
			
$timeout, $interval layout: posttitle: Angular@1.4.3 中文 API 服务篇 $timeout & $intervaldesc: '$ti ...
 - zoj 2110
			
这道题困扰我的不是算法问题.而是细节问题.不优化一直搜到底 时间是690ms左右 没有优化的dfs #include<stdio.h> #include<string.h> # ...
 - C#中窗体的一些简单运用(Sixteenth Day)
			
从今天开始,我们进入到学window form的知识,今天简单的学习了一些控件和事件的运用.没有什么很全面的理论,所以今天就总结下所写的程序.一个简单的注册页面程序 注册页面程序 要求: 1:修改所有 ...