类与对象
- 1、静态成员函数没有this指针,静态成员变量可以通过classname::或object.调用,声明非常量静态成员时,需要在类中加static前缀但不能定义或初始化,在类外定义和初始化但不能再加static前缀(不方便编译器判断这是全局静态变量或属于某一个类)。
- 2、类中函数参数表后加const则函数不能修改类的数据成员。
- 3、友元函数都在类外定义,不能加上classname::前缀。友元函数没有this指针,可以访问类中的所有数据成员。
- 4、this指针只在成员函数里有定义,创建一个对象后不能直接取得this指针的位置。
- 5、构造函数可以有参数,析构函数没有参数,他们都没有返回值。
- 6、struct和class和union都可以用来定义对象,但struct默认全部公有,class默认全部私有。union不支持继承,默认全部成员公有,union实际只能存放一个成员变量,但可以作为其中包含的任意一种变量被使用,union所占的内存空间也由其中占空间最大的类型决定,union也可以拥有成员函数(union一般用的比较少,仅供了解)。
虚函数与虚继承
- 7、类的虚继承指继承的方式,虚基类是相对于继承的类来说的(而不是基类的属性)。虚基类解决了多继承中父类存在多个共同基类实例的问题(非虚继承的情况下,如B、C继承A,D继承B、C,则D型对象继承了B-A和C-A两个不同的基类),从而共享A的数据成员。
- 8、当继承关系满足:基类A-基类B(虚继承基类A)-派生类C。派生类的构造函数的执行顺序:基类A、基类B、对象成员、派生类。通常在多继承中会出现多个基类B虚继承基类A,基类A的构造函数首先被调用,基类B不调用A类的构造函数。
#include <iostream>
using namespace std;
//一个计算几何体周长体积的程序
class Circle{
public://我差点没写?私有构造函数海星
Circle(double radiu){
radius=radiu;
}
virtual double area(){
return 3.14*radius*radius;
};
virtual double volume(){
return 0;
};
protected://这里声明为protected,如果是private,重载的虚函数不能使用这些数据成员
double radius;
};
class Sphere:public Circle{//这里一定要声明public,否则默认private,基类指针访问不了子类的继承的数据成员
public:
Sphere(double radius):Circle(radius){
}
double volume(){
return 100+4/3.0*3.14*radius*radius*radius;
}
double area(){
return 200+4*3.14*radius*radius;
}
};
class Column:public Circle{
public:
Column(double radius, double heigh):Circle(radius),height(heigh){
}
double volume(){
return 300+3.14*radius*radius*height;
}
double area(){
return 400+3.14*radius*radius*2+2*3.14*radius*height;
}
private:
double height;
};
int main(){
Sphere ball(1);
cout<<ball.area()<<endl<<ball.volume()<<endl;
Column col(1,1);
cout<<col.area()<<endl<<col.volume()<<endl;
Circle* ptr;//多态通过基类指针的移动实现
ptr=&ball;
cout<<ptr->area()<<endl<<ptr->volume()<<endl;
ptr=&col;
cout<<ptr->area()<<endl<<ptr->volume()<<endl;
return 0;
}
#include <iostream>
using namespace std;
class teacher{
public:
teacher(double pe){
peroids=pe;
}
virtual int total(){
return 0;
}
protected:
int peroids;
};
class pro:public teacher{
public:
pro(double pe):teacher(pe){
}
int total(){
return 5000+50*peroids;
}
};
class proAssistant:public teacher{
public:
proAssistant(double pe):teacher(pe){
}
int total(){
return 3000+30*peroids;
}
};
class lecture:public teacher{
public:
lecture(double pe):teacher(pe){}
int total(){
return 2000+20*peroids;
}
};
int main(){
teacher* ptr;
pro a(10);
proAssistant b(10);
lecture c(10);
ptr=&a;
cout<<ptr->total()<<endl;
ptr=&b;
cout<<ptr->total()<<endl;
ptr=&c;
cout<<ptr->total()<<endl;
return 0;
}
流对象
- 10、常见的文件打开模式:ios::in 打开并读取, ios::out 打开以写入, ios::trunc 覆盖模式, ios::ate 读文件指针位于文件末尾。如果需要创建新文件,可以用out,也可以用in、out、app的组合。文件打开模式组合较多,详情见相关网站。
- 11、关于流的方向:in和out是相对于与流操作的对象来说的,比如cin>>a,cin将键盘输入传给a,也就是a的in(输入);cout<<a时a的内容传给cout进而传给显示器,a的内容out(输出)了;文件对象同上,in模式文件对象fs使用>>运算符,将fs的内容传给右边的对象。运算符总能表示流的方向。
相关推荐