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;
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析构函数。