#include <stdlib.h>
#include <iostream> //这是一个关于引用形参,const形参,指针形参的程序,用于理解不同形式的区别
using namespace std; //非引用形参:是“实参”的一个拷贝副本,修改“形参”不影响“实参”
//const常量:值不可修改
//非引用非const形参和非引用const形参均可由const或非const实参初始化
int use_ptr1(int val)//非引用非const形参
{
return ++val; //可以修改
} int use_ptr2(const int val) //非引用const形参
{
return val; //不可修改
} //指针形参
int use_ptr3(int *s1) //指针形参指向非const对象
{ //只能由指向非const对象的实参指针初始化
return ++(*s1); //可以修改
}
int use_ptr4(const int *s2) //“指向const对象的指针”作为形参
{ //可以由“指向const和非const对象的实参指针”初始化(whl啥意思)
return *s2; //不可修改
} /*********************************/
//以“引用”作为“形参”:直接关联到绑定对象,对“形参”的修改就是对“实参”的修改
int use_ptr5(int &val) //非const引用形参
{ //只能与完全同类型的非const对象关联
return ++val; //不允许传递右值或需要类型转换的对象
}
int use_ptr6(const int &val) //const引用形参
{ //可以由非const或const对象初始化
return val; //也可以传递右值或需要类型转换的对象
} //传递指针的引用
void ptrswap1(int *&s1,int *&s2) //指向非const对象的指针的引用
{
//形参定义的理解:int *&a->a是一个引用,与指向int型对象的指针相关联。也就是说,a是传递进函数swap的任意指针的别名
//使用“指向非const对象的指针”初始化
int *temp = s2;
s2 = s1;
s1 = temp;
} void ptrswap2(const int *&s1,const int *&s2) //“指向const对象的指针”的引用
{
//形参定义的理解:const int *&a->a是一个引用,与指向int型const对象的指针相关联。
//使用指向const对象的指针初始化
const int *temp = s2;
s2 = s1;
s1 = temp;
} /*********************************/
int main()
{
int v1 = ;
const int v2 = ;
short v3 = ;
cout << v1 << " " << v2 << endl; use_ptr1(v1);
use_ptr1(v2);
cout << v1 << " " << v2 << endl; use_ptr2(v1);
use_ptr2(v2);
cout << v1 << " " << v2 << endl; use_ptr3(&v1);
//use_ptr3(&v2); //error:不能使用指向const对象的指针来初始化指向非const对象的指针
cout << v1 << " " << v2 << endl; use_ptr4(&v1);
use_ptr4(&v2);
cout << v1 << " " << v2 << endl; use_ptr5(v1);
//use_ptr5(v2); //error:不能使用const对象指初始化非const引用形参
//use_ptr5(v3); //error;不能使用不同类型的对象来初始化形参
//use_ptr5(0); //error:不能使用右值来初始化
//use_ptr5(v1+v2); //error: 不能使用右值来初始化 use_ptr6(v1);
use_ptr6(v2);
use_ptr6(v3); //OK:类型转换
use_ptr6(); //OK:右值
use_ptr6(v1+v2); //OK:右值 int a = , b = ;
int *p1 = &a;
int *p2 = &b;
const int *p3 = &a;
const int *p4 = &b; ptrswap1(p1, p2);
//ptrswap1(p3, p4); //error:指向const对象的指针
cout << *p1 << " " << *p2 << endl; //ptrswap2(p1, p2); //error:指向非const对象的指针
ptrswap2(p3, p4);
cout << *p1 << " " << *p2 << endl;
system("pause");
return ;
}

各类形参(引用,const,指针)的更多相关文章

  1. C++的引用与const指针的关系以及各种传递方式

    首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量:而 int * const p 跟上面是不一样的,即 p 是常量:我们知道引用只是一个别名,与变量共享 ...

  2. 函数返回值为 const 指针、const 引用

    函数返回值为 const 指针,可以使得外部在得到这个指针后,不能修改其指向的内容.返回值为 const 引用同理. class CString { private: char* str; publi ...

  3. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  4. 【c++基础】const、const指针、const引用

    一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) ; co ...

  5. Const指针 、 指向const的指针 、引用、指针

    1. const指针和 指向const的指针 指向const的指针: 不允许通过指针来改变其指向的const值 const double *cptr *cptr = 42;  // error! 指针 ...

  6. C++ 中的 const、引用和指针的深入分析

    1,关于 const 的疑问: 1,const 什么时候为只读变量,什么时候是常量: 1,const 从 C 到 C++ 进化的过程中得到了升级,const 在 C++ 中不仅仅像在 C 中声明一个只 ...

  7. const、引用与指针

    前提 我们忽略掉了相同类型是否可以赋值的情况(我到现在的学习里都还可以相互赋值),以及类型兼容的情况.只考虑const.&.*等修饰符带来的影响 类型兼容: 强制类型转换 基类与子类间的兼容 ...

  8. C、C++中引用与指针的区别

    1:引用的和指针在概念上的区别 引用是变量的别名,例如 int m; int &n=m; 引用作为一个别名.它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用 ...

  9. 浅谈C/C++引用和指针的联系和区别

    为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...

随机推荐

  1. select函数详解及应用

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv或recvfrom这样的阻塞程序 ...

  2. Delphi 取外网IP

    近日偶要做个程序,需要获得外网IP,偶去网上找相关资料,发现都不尽如人意,有的只能获得本地网卡的IP,有的通过httpget控件获取IP,还有甚者做个asp再调用偶是个懒人,而且上面提到的方法,不是获 ...

  3. Controller中获取输入参数注解使用总结

    1.处理request的uri部分的参数(即restful访问方式):@PathVariable. 当使用restful访问方式时, 即 someUrl/{paramId}, 这时的参数可通过 @Pa ...

  4. 【Android】自带Theme

    [Android]自带Theme android之uses-permission   在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...

  5. The Tips of Success(成功的建议)

    1.Do one thing at a time,and do well. 2.Never forget to say "thanks". 3,Keep on going.Neve ...

  6. 【Andord真】SlideMenu+ViewPagerIndictor双滑动边栏+滑动导航条

    采取SlideMenu达到的效果侧边栏: 间 setContentView是设置主背景的布局 setBehindContentView是设置左边菜单的布局 setSecondaryMenu是设置右边的 ...

  7. Java 可中断线程

    PART.1 无法中断的线程 一个无法中断的线程的例子. public class UninterruptableThread { @SuppressWarnings("deprecatio ...

  8. C#:占位符的例子

    在c#中有两种方式可以输出多个字符. static void Main() { string c=Console.ReadLine(); string d=Console.ReadLine(); Co ...

  9. oFixed() 方法

    oFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 在本例中,我们将把数字舍入为仅有一位小数的数字: Show the number 13.37 with one decimal ...

  10. TCP/IP的三次握手协议

    关于TCP/IP的三次握手协议,这篇文章中有详细的介绍,很通俗易懂,什么时候忘了,都可以过来瞧两眼,保证很快就明白了. 首先TCP/IP协议分为三个阶段:建立连接(握手阶段),数据传输阶段,连接终止阶 ...