自己从C过渡到学C++的时候,对于面向过程和面向对象两种编程思想一直模模糊糊分不清楚,所以花了很大的功夫(侧面说明我可能不适合编程?)为了提醒,也是为了做一点小总结,特意总结了一些学习的时候发现的易错点
一、类在声明的时候,必须要写清private和public,否则编译器会默认你的所有函数和变量都是private形式,如果在后期需要进行public型继承,就会报错
class Point{
private:
int x;
int y;
void Position(int x,int y)
{
cout<<x<<y<<endl;
}
public:
Point(){
cout<<"我是构造函数我自豪"<<endl;
}
int Distance(int x,int y)
{
return x*x+y*y;
}
};
二、如果在继承的时候,需要使用到基类的一些函数或者变量,这些变量的声明形式不同,使用方式也不同
1.如果需要调用的函数/变量在基类中是私有成员(private):在子类中调用,或者在主函数中声明的对象中使用的时候,会出现报错
比方说,我现在要在Point的基础上派生出一个Rectangle的类
class Rectangle:public Point
如果我再Rectangle里再次直接构造一个构造函数,就会报错
如果想在子类中重新定义构造函数,必须要先声明继承的来源parent
好像还是有什么地方不对,原来是作为私有成员的xy不能被直接调用
我们把Rectangle的构造函数再修改一下,接口变为和基类相同
Rectangle(int x,int y):Point(x,y)
{
cout<<"我是矩形"<<endl;
}
这下就没问题了
同理对于下面的调用方式,只要保证数据传入,就可以正常使用
void Rec_Distance(int x,int y)
{
cout<<Distance(x, y)<<endl;
}
2.如果是在一个类当中,直接在public里调用自身的私有成员,是始终没有问题的
class Point{
private:
int x;
int y;
void Position(int x,int y)
{
cout<<x<<y<<endl;
}
public:
Point(int x,int y){
cin>>x>>y;
cout<<"我是构造函数我自豪"<<"我的位置就在"<<x<<y<<endl;
}
int Distance(int x,int y)
{
Position(x, y);
return x*x+y*y;
}
~Point()
{
cout<<"啊,我被删除了!"<<endl;
}
};
可以看出,Position作为私有成员函数是可以被成功调用的
3.如果是在子类当中呢?
可以看出,这个就没有办法成功调用了
4.析构函数
不过,在析构函数的使用中,就没有那么多讲究了,可以直接使用
~Rectangle(){
cout<<"啊,矩阵被删除了!"<<endl;
}
没有报错
5.最后使用的时候的结果
int main()
{
cout<<"Please input"<<endl;
Rectangle rectangle(1,2,3,4);
return 0;
}
class Point{
private:
int x;
int y;
void Position(int x,int y)
{
cout<<x<<y<<endl;
}
public:
Point(int x,int y){
cin>>x>>y;
cout<<"我是构造函数我自豪"<<"我的位置就在"<<x<<y<<endl;
}
int Distance(int x,int y)
{
Position(x, y);
return x*x+y*y;
}
~Point()
{
cout<<"啊,我被删除了!"<<endl;
}
};
class Rectangle:public Point
{
private:
int row;
int line;
void Square(int row,int line)
{
cout<<"我的面积是:"<<line*row<<endl;
}
void Rec_Position(int x,int y)
{
cout<<"我的位置是:"<<x<<y<<endl;
}
public:
Rectangle(int x,int y,int row,int line):Point(x,y)
{
cout<<"我是矩形"<<line<<row<<endl;
}
void Rec_Distance(int x,int y)
{
cout<<Distance(x, y)<<endl;
}
void Rec_position(int x,int y)
{
cout<<x<<y<<endl;
}
~Rectangle(){
cout<<"啊,矩阵被删除了!"<<endl;
}
};
运行结果是
被卡住了。而Rectangle的构造函数并没有赋值的地方,如果我们删去基类Point中构造函数里的赋值部分:
可以看出,在最终使用的时候,子类的对象其实是先调用基类的构造函数再使用自己的构造函数,析构的时候则是先自己再基类