打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C++ const面试题和相关的解释
扎实的基础知识、高质量的代码、清晰的思路、优化代码的能力、优秀的综合能力是编程技术面试的五大要点。
如果函数需要传入一个指针,面试官可能会问是否需要为该指针加上const,把const加在指针不同的位置有什么区别;如果写的函数需要传入的参数是一个复杂类型的实例,面试官可能会问传入值参数或者引用参数有什么区别,什么时候需要为传入的引用参数加上const。

(1)const是用来声明一个常量的,当你不想让一个值被改变时就用const,
const int max && int const max 是没有区别的,都可以。
不涉及到指针const很好理解。
涉及到指针的情况:
int b=100;
const  int * a=&b  [1];
int   const   *a=&b;     [2]
int*   const   a=&b;     [3]
const   int*   const   a =&b;     [4]
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a   =   3   ;
[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;
[4]为指针本身和指向的内容均为常量。
 
更多的解释

1、用const修饰函数的输入参数。第一,对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用,目的是提高效率。例如将void Func(A a)改为voidFunc(const A&a)。第二,对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x)不应该改为void Func(const int&x)。

2、用const修饰函数的返回值。

第一,如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。例如函数

const char*GetString(void);

如下语句将出现编译错误:

char*str=GetString();

正确的用法是:

const char*str=GetString();

第二,如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。例如不要把函数int GetInt(void)写成const int GetInt(void)。同理不要把函数A GetA(void)写成const A GetA(void),其中A为用户自定义的数据类型。如果返回值不是内部数据类型,将函数A GetA(void)改写为const A&GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。

第三,函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。例如:

class A

{…

A&operate=(const A&other);//赋值函数

};

A a,b,c;    //a,b,c为A的对象

a=b=c;  //正常的链式赋值

(a=b)=c;    //不正常的链式赋值,但合法

如果将赋值函数的返回值加const修饰,那么该返回值的内容不允许被改动。上例中,语句a=b=c仍然正确,但是语句(a=b)=c则是非法的。

        3、const修饰成员函数。

任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount仅用于计数,从逻辑上讲GetCount应当为const函数。编译器将指出GetCount函数中的错误。

class Stack

{

public:

void Push(int elem);

int Pop(void);

int GetCount(void)const;//const成员函数,const只能放在函数的尾部

private:

int m_num;

int m_data[100];

};

int Stack::GetCount(void)const

{

++m_num;    //编译错误,企图修改数据成员m_num

Pop();      //编译错误,企图调用非const函数

return m_num;

}

const成员函数的声明看起来怪怪的:const关键字只能放在函数声明的尾部,大概是因为其它地方都已经被占用了。

char greeting[] = "Hello";

char *p = greeting;                 // non-const pointer,non-const data

const char *p = greeting;         // non-const pointer, const data

char * const p = greeting;        // const pointer, non-const data

const char * const p = greeting;// const pointer , const data
1、解释下面ptr含义和不同
double* ptr = &value;
    //ptr是一个指向double类型的指针,ptr的值可以改变,ptr所指向的value的值也可以改变 
const double* ptr = &value
    //ptr是一个指向const double类型的指针,ptr的值可以改变,ptr所指向的value的值不可以改变
double* const ptr=&value
    //ptr是一个指向double类型的指针,ptr的值不可以改变,ptr所指向的value的值可以改变
const double* const ptr=&value
    //ptr是一个指向const double类型的指针,ptr的值不可以改变,ptr所指向的value的值也不可以改变

2、去掉const属性,例:  const double value = 0.0f;  double* ptr = NULL;怎么才能让ptr指向value?
    强制类型转换,去掉const属性,如ptr = <const_cast double *>(&value);
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
const放在函数前后的区别
高质量C /C编程指南 - 第11章 其它编程经验 参考文献 - 欢迎阁下光临我的网络日...
修饰函数和函数返回值的const的差别 - zhb的日志 - 网易博客
const的作用
C++中const用法总结
typedef的用法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服