const形参与非const形参

在程序设计中我们会经常调用函数,调用函数就会涉及参数的问题,那么在形参列表中const形参与非const形参对传递过来的实参有什么要求呢?

先来看一个简单的例子:

[java] view plain

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. void print_str(const string s)
  5. {
  6. cout<<s<<endl;
  7. }
  8. int main()
  9. {
  10. print_str("hello world");
  11. return 0;
  12. }

毫无疑问,const实参传递给const形参,正确调用函数,如果你将第4行代码中的const去掉,也能得到正确的结果。那么在去掉const的基础上将形参变为引用形参,会出现什么样的结果呢?看下面的代码:

[cpp] view plain

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. void print_str( string & s)
  5. {
  6. cout<<s<<endl;
  7. }
  8. int main()
  9. {
  10. print_str("hello world");
  11. return 0;
  12. }

发现编译不通过,如果在第4行的string前加上一个const,就会通过编译。进一步研究我们会发现指针形参与引用形参会出现类似的情况。

普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。

为什么会出现这种情况?

原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。

我一直这样记忆:“对于变量的约束,允许加强,当绝对不能削弱.....”
例如:实参是const,那么形参如果是非const意味着可以在函数体中改变形参的值,使约束削弱了所以不行。对于使用&,自然也是这个道理。同样的,指针里面的const也是这个样子的,如果让非const指针指向了const对象的地址,那么必然是无法通过编译的,因为如果这样做了,意味着可以通过这个指针改变本该是const的值了,显然是使约束削弱了

时间: 2024-10-05 04:01:46

const形参与非const形参的相关文章

【C++总结】函数形参,返回const对象与非const对象

非引用形参 //交换函数,传递的实参只是参数的副本.并不能起到交换作用 void swap(int a, int b) { int m = a; a = b; b = m; } 指针形参 //可以起到交换作用 void swap(int *a, int *b) { int m = *a; *a = *b; *b = m; } 引用形参 //可以起到交换作用 void swap(int &a, int &b) { int temp = a; a = b; b = temp; } const形

const引用与非const引用

void print1(int a) { cout<<a<<endl; } void print2(const int& a) { cout<<a<<endl; } void print3(int& a) { cout<<a<<endl; } int main() { int a = 10; int& b = a; const int& c = a; print1(a); print1(b); prin

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

[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, const 对象的引用 作者:webabcd 介绍不可或缺 Windows Native 之 C++ this 指针 对象数组 对象和指针 const 对象 const 指针和指向 const 对象的指针 const 对象的引用 示例1.CppEmployee 类CppEmployee.h #pragma

const成员函数和const对象的调用关系

代码: class A{ private: int a; public: void set() { } <span style="white-space:pre"> </span>void set () const <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>} }

c++中临时变量不能作为非const的引用参数

试看下面的代码: #include <iostream> using namespace std; void f(int &a) { cout << "f(" << a  << ") is being called" << endl; } void g(const int &a) { cout << "g(" << a << "

临时变量作为非const的引用进行参数传递引发的编译错误

1.错误原因即解决办法 Linux环境运行,使用g++编译,观察如下代码,会出现: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'的错误. 其中文意思为临时变量无法为非const的引用初始化.也就是在参数传递的过程中,出现错误.出错的代码如下: void print(string& str) { cout<<st

非const引用不能指向临时变量

没找到具体原因,MSDN看到下面这句,VC是从2008才有这一限制的,感觉就是从语法上对临时变量增加了限定,因为一般说来修改一个临时变量是毫无意义的,通过增加限定,强调临时变量只读语义.虽然实际上修改临时变量并不会有问题. Visual Studio 2008 In previous releases of Visual C++, non-const references could be bound to temporary objects. Now, temporary objects ca

非const对象也可以调用const成员函数

当一个类只有const成员函数的时候,非const对象也可以调用const成员函数: // ConstTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class A { public: A( void ) { } void func( void ) const { cout << "const version"

【ThinkingInC++】45、比较const和非const成员函数的例子

/** * 书本:[ThinkingInC++] * 功能:旧代码中的enum hack * 时间:2014年9月10日08:35:13 * 作者:cutter_point */ #include<iostream> #include<ctime> #include<cstdlib> using namespace std; class Bunch { enum {size=1000}; int i[size]; }; int main() { cout<<