C/C++几个面试常见细节问题及解答

1. 下面两个表达式有没区别,什么区别?

const char *p = "Hello"; 
char* const p = "Hello"; 

2.输出什么,为什么? 

int t = 0;
sizeof(t++); 
cout<<t<<endl; 

3.下面的赋值合法吗?其中的区别是什么?

int a = 0;
++a = 9;
a++ = 9;


4.下面程序合法吗?若合法输出什么?
printf("%d", printf("%s", "abc"));

5.下面的程序有错吗?如果正确输出什么?

int a[] = {10, 20, 30, 40, 50};
printf("%d %d\n", 3[a], -4[a]);

6.输出什么?

#include <iostream>

class Base{
public:
	void doSomething(){
		doit();
	}

private:
	virtual void doit(){
		std::cout<<"Base virtual!\n";
	}
};

class Derived: public Base{
private:
	virtual void doit(){
		std::cout<<"Derived Hello!\n";
	}
};

int main(int argc, char *argv[])
{
	Base *pb = new Derived();
	pb->doSomething();
}

7. C++类的析构函数能否为virtual?







参考(个人理解,如有错误请多指教,有空继续更新):

1.第一个表达式定义的是指向常量的指针,其指向的内容不可以被改变;第二个表达式的指针是常量,即指针p的值不能再被改变。

2.sizeof(t++)中其实没做自增操作,目前找到的一种比较合理的解释是sizeof()是操作符,在编译阶段就已经求出结果了。因为试过像int arr[sizeof(int)];这样的定义可以通过编译,说明sizeof()的结果可以当常量用。

3.其中++a = 9;可以编译,而a++ = 9;编译无法通过。目前按类的思想理解,不知是否恰当,因为类中operator++前缀操作返回的是*this指针的引用,所以可以对*this赋值;而operator++后缀操作一般返回一个临时变量的值,所以不可以赋值。

4.结果为“abc3”,由于printf()函数返回值是其输出的字符个数,所以上式合法。

5.目前只验证了一下是输出的结果等于a[3]和-a[4],这种写法的具体含义待考证。

6.Derived Hello!

7.析构函数可以为virtual,根据《Effictive C++》07条款的建议,只要类中存在virtual函数几乎该使用virtual析构函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值