1. 类中的成员函数和成员变量不能同名, 所以同名的变量也会隐藏父类的同名函数.
2.
class Base{
public:
virtual void show(){
cout << "In Base" << endl;
}
};
class Derived: public Base{
public:
void show(){
cout << "In Derived" << endl;
}
};
int main(){
Base b;
b.show();
Derived d;
d.show(); //对函数show()的实调用
d.Base::show(); //对函数show()的实调用
Base *pb;
pb = &d;
pb->show(); //对函数show()的虚调用
pb->Base::show(); //对函数show()的实调用
}
3. 不能在一个类中定义一个常量数组,因为无法为对象的常量数组成员初始化。
一个变通的做法是定义一个指向常量的指针常量,然后在初始化列表中为它初始化。
class A{
int arrsize;
const int * const arr;
public:
A(int n):arr(CreateArr(n)){ arrsize=n;}
~A(){delete[] arr;}
};
4.正确的:
SomeClass obj(5);
SomeClass obj=SomeClass(5);
Someclass obj(SomeClass(5));
SomeClass obj;
SomeClass obj=SomeClass();
p = new SomeClass(5);
p = new SomeClass();
p = new SomeClass;
p = new SomeClass[3]; //一次性产生三个对象
错误的:
SomeClass obj();
SomeClass obj=SomeClass;
SomeClass obj(SomeClass);
SomeClass obj(SomeClass());
p = new SomeClass(5)[3]; //企图为每个对象调用指定的构造函数
5. 在类对象的成员函数中访问该类的别的对象的非公有成员,可通过点操作符进行。
6.
1.除了作用域上的联系之外,其实外围类与嵌套类是两个完全独立的类,并没有其他特殊的关系。
如果将类B的构造函数放到类B的类体之外、类A的类体之内来定义,就会出现编译错误,因为这与重写纯虚函数的语法相冲突。
2.对于局部类,其成员函数可以访问在定义该局部类的函数中定义的静态变量.并且其成员函数必须在函数体内定义.
7. 静态常量成员可以在类体之内和之外初始化, 如果是在类体之外为静态常量成员赋初值,变量前面的const关键字不能省略. 非常量的静态成员不能在类体内初始化.
8.
#include "confuse1.h"
void useClass();
int main(){
A a;
a.show();
useClass();
}
-----------------------------------
#ifndef CONFUSE1_H_
#define CONFUSE1_H_
#include <iostream>
using std::cout;
using std::endl;
class A{
int num;
public:
A(){num=5;}
void show(){
cout << num << endl;
}
};
#endif /*CONFUSE1_H_*/
--------------------------------------
#ifndef CONFUSE2_H_
#define CONFUSE2_H_
#include <iostream>
using std::cout;
using std::endl;
class A{
int num;
public:
A(){num=6;}
void show(){
cout << "another num=" << num << endl;
}
};
#endif /*CONFUSE2_H_*/
-----------------------------------------------
#include "confuse2.h"
void useClass(){
A a;
a.show();
}
-----------------------------------------------
输出结果可能是: 5 5 或者 another num=6 another num=6
9. 抽象类不一定要包含纯虚函数,如果他的构造函数或者析构函数为protected也可以说是抽象类.
10. (一)不定义任何成员的类,其大小为1。
(二)只定义一个数据成员的类,其大小就是该数据成员的大小。
(三)定义成员函数并不会增加对象的尺寸。
(四)定义静态成员不会增大对象的尺寸。
(五)对象尺寸并不一定等于各成员变量尺寸之和。
(六)定义虚函数会导致对象尺寸增加4字节。
(七)任何一个派生类对象都包含一个基类对象。
(八)包含虚函数的类对象在计算成员变量的偏移量时,要考虑虚指针的影响。
假设类B是类A的派生类,类A没有虚函数,类B有虚函数,若有如下代码:
B b; cout << (void*)&b << endl;
A *p=&b; cout << p << endl;
两次输出的结果是否相同? 不相同,后面的比前大4
11.
------------------正确---------------
int getint(){
int tmp;
cin >> tmp;
return tmp;
}
class A{
public:
static const int j; //statement2
};
const int A::j=getint(); //statement3
int main(){
cout << A::j << endl;
}
----------------错误---------------------
int getint(){
int tmp;
cin >> tmp;
return tmp;
}
class A{
public:
static const int j=getint(); //statement1
};
int main(){
cout << A::j << endl;
}
2.
class Base{
public:
virtual void show(){
cout << "In Base" << endl;
}
};
class Derived: public Base{
public:
void show(){
cout << "In Derived" << endl;
}
};
int main(){
Base b;
b.show();
Derived d;
d.show(); //对函数show()的实调用
d.Base::show(); //对函数show()的实调用
Base *pb;
pb = &d;
pb->show(); //对函数show()的虚调用
pb->Base::show(); //对函数show()的实调用
}
3. 不能在一个类中定义一个常量数组,因为无法为对象的常量数组成员初始化。
一个变通的做法是定义一个指向常量的指针常量,然后在初始化列表中为它初始化。
class A{
int arrsize;
const int * const arr;
public:
A(int n):arr(CreateArr(n)){ arrsize=n;}
~A(){delete[] arr;}
};
4.正确的:
SomeClass obj(5);
SomeClass obj=SomeClass(5);
Someclass obj(SomeClass(5));
SomeClass obj;
SomeClass obj=SomeClass();
p = new SomeClass(5);
p = new SomeClass();
p = new SomeClass;
p = new SomeClass[3]; //一次性产生三个对象
错误的:
SomeClass obj();
SomeClass obj=SomeClass;
SomeClass obj(SomeClass);
SomeClass obj(SomeClass());
p = new SomeClass(5)[3]; //企图为每个对象调用指定的构造函数
5. 在类对象的成员函数中访问该类的别的对象的非公有成员,可通过点操作符进行。
6.
1.除了作用域上的联系之外,其实外围类与嵌套类是两个完全独立的类,并没有其他特殊的关系。
如果将类B的构造函数放到类B的类体之外、类A的类体之内来定义,就会出现编译错误,因为这与重写纯虚函数的语法相冲突。
2.对于局部类,其成员函数可以访问在定义该局部类的函数中定义的静态变量.并且其成员函数必须在函数体内定义.
7. 静态常量成员可以在类体之内和之外初始化, 如果是在类体之外为静态常量成员赋初值,变量前面的const关键字不能省略. 非常量的静态成员不能在类体内初始化.
8.
#include "confuse1.h"
void useClass();
int main(){
A a;
a.show();
useClass();
}
-----------------------------------
#ifndef CONFUSE1_H_
#define CONFUSE1_H_
#include <iostream>
using std::cout;
using std::endl;
class A{
int num;
public:
A(){num=5;}
void show(){
cout << num << endl;
}
};
#endif /*CONFUSE1_H_*/
--------------------------------------
#ifndef CONFUSE2_H_
#define CONFUSE2_H_
#include <iostream>
using std::cout;
using std::endl;
class A{
int num;
public:
A(){num=6;}
void show(){
cout << "another num=" << num << endl;
}
};
#endif /*CONFUSE2_H_*/
-----------------------------------------------
#include "confuse2.h"
void useClass(){
A a;
a.show();
}
-----------------------------------------------
输出结果可能是: 5 5 或者 another num=6 another num=6
9. 抽象类不一定要包含纯虚函数,如果他的构造函数或者析构函数为protected也可以说是抽象类.
10. (一)不定义任何成员的类,其大小为1。
(二)只定义一个数据成员的类,其大小就是该数据成员的大小。
(三)定义成员函数并不会增加对象的尺寸。
(四)定义静态成员不会增大对象的尺寸。
(五)对象尺寸并不一定等于各成员变量尺寸之和。
(六)定义虚函数会导致对象尺寸增加4字节。
(七)任何一个派生类对象都包含一个基类对象。
(八)包含虚函数的类对象在计算成员变量的偏移量时,要考虑虚指针的影响。
假设类B是类A的派生类,类A没有虚函数,类B有虚函数,若有如下代码:
B b; cout << (void*)&b << endl;
A *p=&b; cout << p << endl;
两次输出的结果是否相同? 不相同,后面的比前大4
11.
------------------正确---------------
int getint(){
int tmp;
cin >> tmp;
return tmp;
}
class A{
public:
static const int j; //statement2
};
const int A::j=getint(); //statement3
int main(){
cout << A::j << endl;
}
----------------错误---------------------
int getint(){
int tmp;
cin >> tmp;
return tmp;
}
class A{
public:
static const int j=getint(); //statement1
};
int main(){
cout << A::j << endl;
}