从cin>>ch, cin.get(ch)看C++的参数引用
来源:互联网 发布:话费好帮手软件 编辑:程序博客网 时间:2024/05/30 04:16
一、引言
C语言用久了,今天看到C++的cin用法,突然觉得很有问题,例如:
char ch;cin>>ch;cin.get(ch);
按照C语言风格,应该用的是地址或者指针:
cin>>&ch; //写法不一定正确get(&ch); //写法不一定正确
否则,就像函数get(ch),参数是按值传递,函数内部无法修改ch的值。
为什么C++可以这样使用呢? 查了查资料以后,才知道,这是C++新引入的 “参数引用”。查看get()函数的原型为: istream& get ( char& c );
二、代码验证
下面用代码验证一下参数引用。
1、在C语言中,如下代码:
void changeVal(int &data) //error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token
{
data = 100;
}
用gcc编译不通过error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token。 可知C语言不支持参数引用。(或者说至少是我的gcc编译器4.4.4不支持)
下面我们看下按值传递
void changeVal(int data)
{
printf("the address of data is %p \n", &data); //the address of data is 0xbfc91960
data = 100;
}
int main(int argc, char *argv[])
{
int data = 10;
printf("the address of data is %p \n", &data); //the address of data is 0xbfc9197c
changeVal(data);
printf("data = %d \n", data); //10
return 0;
}
按值传递,传入函数的只是data的一个副本(两处地址不一样)
2、C++语言
void changeVal(int &data)
{
cout<<"the address of data is "<<&data<<endl; //the address of data is 0xbfa6b33c
data = 100;
}
int main(int argc, char *argv[])
{
int data = 10;
cout<<"the address of data is "<<&data<<endl; //the address of data is 0xbfa6b33c
changeVal(data);
cout<<"data = "<<data<<endl; //data = 100
return 0;
}
可以看出,参数引用传入的就是data参数,并不是其副本。
三、cin>>, cin.get(ch)的几种用法
经过上面的代码对比后,我想可不可以用C语言的风格来使用cin呢?
char data = 'a';
cin>>data;
cin>>&data; //居然可以?
cin.get(data);
//cin.get(&data); //error: no matching function for call to ‘std::basic_istream<char, std::char_traits<char> >::get(char*)’
观察下上面代码, 什么?cin>>&data;居然可以??? 如果将data改成int类型会如何呢?
int data = 10;
cin>>data;
cin>>&data; //error: no match for ‘operator>>’ in ‘std::cin >> & data’
为什么char类型的可以,int不行呢? 这就涉及到cin的识别问题。 如果传入的是(char *)&data,则cin会将这个地址当成字符串的开始地址。上面的int类型,强转后,就可以通过编译
int data = 10;
cin>>data;
cin>>(char*)&data; //编译通过
下面我们通过代码验证一下cin是否将cin>>(char*)&data;识别成了字符串。
char data = 'a';
cin>>&data;
cout<<"data = "<<&data<<endl;
编译执行该段代码:
./parameter
hello
data = hello
通过上述代码,cin>>&data,确实将&data当成了字符串首地址。
- 从cin>>ch, cin.get(ch)看C++的参数引用
- cin.get()和cin.get(ch)之间的区别
- cin.get(ch)的合法性解说
- while(cin>>ch)如何退出
- while(cin>>ch)如何退出
- 关于while ( cin >> ch )输入结束问题
- cin.get(),cin,cin.getline()的区别
- cin,cin.get,cin.getline的区别
- cin,cin.get()的区别
- cin , cin.get() , cin.getline() , getline() , cin.ignore() 的用法
- C++--cin.get() 大法
- C++: cin.get()与cin.getline()
- cin、cin.get()、cin.getline()、getline()、gets()等函数的用法(C++)
- ch
- cin cin.get cin.getline
- cin cin.get cin.getline
- cin,cin.get,cin.getline.
- cin cin.get cin.getline
- smail语法简析(1)
- POJ1426_Find The Multiple_测试出真知
- Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
- Java中的循环结构
- 正则表达式基本语法学习
- 从cin>>ch, cin.get(ch)看C++的参数引用
- MFC Windows应用程序设计——学习笔记【1】
- list.h 简单运用
- Linux进程间通信——使用共享内存
- python爬虫
- 我也说说ThreadLocal
- git多平台换行设置引起的问题
- 32字产品口诀
- smail语法简析(2)