小女子新学C++,弱弱地问一个关于函数的参数传递的问题
就是我发现常数型的字符数组不能赋给不加const的函数参数。比如下面这个程序,编译的时候有错误
#include "stdafx.h"
#include<iostream>
using namespace std;
const char a[]={'a','b','c'};
bool compare(char a[], char b[])
{
for(int i=0;i<3;++i)
{
if(a[i]!=b[i])return false;
}
return true;
}
void keep_window_open();
int _tmain(int argc, _TCHAR* argv[])
{
char b[]={'a','b','d'};
if(compare(a,b))cout<<"Great!\n";
else cout<<"Terrible!\n";
keep_window_open();
return 0;
}
void keep_window_open()
{
cout<<"Input any character to exit:";
char ch;
cin>>ch;
}
这是为什么呀?这个问题可以通过在函数的相应参数前面,比如这里的compare里面的char a[]前面加上const来解决,可是这样子的话岂不是函数的使用范围大大减小了?有什么更好的解决办法没有呢?
[解决办法]
函数的使用范围并没有减小,因为非const可以转换为const,而反过来不行,所以你在函数体相应参数前面加const,但调用依然可以传入非const类型的参数
[解决办法]
1 养成好习惯
bool compare(char a[], char b[])
既然你函数本身只是比较,不会修改传近来的参数,那么就要加const
应该这么写:bool compare(const char a[],const char b[]);
有人会说,第二个不需要加const。但我告诉你,该加const的就得加,
养成好习惯。
2 const char a[]={'a','b','c'}; 这么写,就是说a在生命周期内不修改。
c/C++ 还有强制转换, 把const转成非const,但这样是违背代码设计
原则的。一般来说,不能这么做。
3 bool compare(const char a[],const char b[]);就算这么写,实现也不好,
应该这么写:
- C/C++ code
bool compare(const char a[], const char b[]){ unsigned int nCounta = sizeof(a)/sizeof(char); unsigned int nCountb = sizeof(b)/sizeof(char); if(nCounta != nCountb) return false; if(nCounta == 0) return true; for (int i = 0; i < nCounta; i ++) { if(a[i] != b[i]) return false; } return true; }
[解决办法]
