1.动态多态与静态多态
动态多态也就是我们经常所说的多态,是通过继承与虚函数来实现的,是运行时确定的。
静态多态则是通过模板技术实现的,这种多态是在编译时期就确定的
http://blog.csdn.net/hackbuteer1/article/details/6550777
将构造函数和析构函数定义为私有成员就可以了。
但是这样了,如何实例化对象了?可以采用静态成员函数实例化和释放对象。
3.构造函数的初始化列表
构造函数的初始化列表中的变量初始化顺序变量在类中声明的顺序一致。
那么能不能将这些变量的初始化就放在构造函数里面,通过赋值了?
在有些情况下,是必须在构造函数的初始化类表里进行的。const类型的成员变量和引用类型的成员变量
Effective C++条款12,和13说明了这个问题。
4.使形参成为const引用,就可以使用同一个定义来输出const和非const对象??
复习关于const对象的一些知识:
A const对象在定义时必须被初始化,因为const对象在定以后就不允许被初始化
B const对象默认为文件的局部变量
非const变量定义
//file_1.cc
int counter;
//file_2.cc
extern int counter;
++counter;
const变量定义,如果要用在别的文件,就必须在定义时指明extern,而非const变量不用。
//file_1.cc
extern const int bufsize = fcn();
//file_2.cc
extern const int bufsize
for(int i = 0; i != bufsize; ++i)
//...........
C
5.C++支持两种初始化变量的形式:复制初始化和直接初始化。两者有细微差别,直接初始化语法灵活且效率更高。
int ival(1024); //direct
int ival = 1024; //copy
初始化不是赋值,两者有区别:初始化是创建变量并给他赋初始值,而赋值则是擦除对象的当前值并用新值替代。
6.变量定义与声明的区别
变量只能定义一次,但是可以声明多次。
7.以下程序段的输出结果是()
#include<iostream>
using namespace std;
class A
{
public:
A(int i )
{
cout<<"A ";
}
~A() { }
};
class B
{
public:
B(int j )
{
cout<<"B ";
}
~B() { }
};
class C
{
public:
C(int k )
{
cout<<"C ";
}
~C() { cout<<"~C "; }
};
class D : public C
{
public:
D(int i , int j , int k ) : a(i) , b(j) , C(k)
{
cout<<"D ";
}
~D() { cout<<"~D "; }
private:
B b;
A a;
};
int main()
{
C *pc = new D(1 , 2 , 3);
delete pc;
return 0;
}
A、A B C D ~D
B、A B C D ~C
C、C B A D ~D
D、C B A D ~C
程序自己跑了,确实是D为什么了??
8.
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
char* str7 = "abc";
char* str8 = "abc";
cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?
printf("%p\n",str5);
cout << boolalpha << ( str7==str8 ) << endl; // 输出什么?
printf("%p\n",str7);
cout<<str5<<endl;
cout<<str7<<endl;
输出结果如下:
可见,str5,str7指向的是同一块存储区域。所以,通过*(str7+1) = 'd';进行修改也是不行的。
9.下面代码的输出是什么?
float a = 1.0f;
cout<< (int)a <<endl;
cout<< (int&)a <<endl;
cout << boolalpha << ( (int)a==(int&)a ) << endl; // 输出什么?
float b = 0.0f;
cout<< (int)b <<endl;
cout<< (int&)b <<endl;
cout << boolalpha << ( (int)b==(int&)b ) << endl; // 输出什么?
分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。
注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,以浮点数形式存放在内存中,按ieee754规定,其内容为x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容x0000803F按整数解释,其值正好就是(十进制数)。
通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版本。
10.非C++内建型别A和B,在哪几种情况下B能隐式转化为A?
1.B是A的子类
2.