C++本来是在下学期的数据结构学的,但是本学期期末考试也会涉及,然后自己学习的话主要是结合菜鸟教程去理解这些内容。因为是期末考试必考内容,所以在这里做一个汇总。
类访问修饰符
感觉学习的时候还是要整体的学,意思是说,单独学习“类访问修饰符”的效果是不如在学习“类访问修饰符”的同时也学习“基类和派生类”。
详细的知识可以参考
C++ 类访问修饰符 | 菜鸟教程 (runoob.com)
这里尝试做个串联。
首先是“:”与“::”的区别,前者是继承,后者是调用。第一题的话,我们可以知道派生类可以从基类访问protected和public,我觉得之所以会有一个protected的区域应该是区别于对象和派生类的。派生类可以访问基类的protected而对象则不能。对象只能访问基类的public。
其次,为什么要有public和private的区别呢?结合菜鸟教程的例子我们可以很好地理解:
#include <iostream>
using namespace std;
class Box
{
public:
double length;
void setWidth( double wid );
double getWidth( void );
private:
double width;
};
// 成员函数定义
double Box::getWidth(void)
{
return width ;
}
void Box::setWidth( double wid )
{
width = wid;
}
// 程序的主函数
int main( )
{
Box box;
// 不使用成员函数设置长度
box.length = 10.0; // OK: 因为 length 是公有的
cout << "Length of box : " << box.length <<endl;
// 不使用成员函数设置宽度
// box.width = 10.0; // Error: 因为 width 是私有的
box.setWidth(10.0); // 使用成员函数设置宽度
cout << "Width of box : " << box.getWidth() <<endl;
return 0;
}
可以知道,最主要的一个原因是因为我们希望一些变量是公有的或者是专有的。比如说在上例的长方体里,理论上来说每个长方体的长宽高不同(每个对象的长宽高不同),那长宽高设为专有就比较合适,但是我们设置长宽高的方法都是一样的,那么这个方法作为公有就比较合适。
指向类的指针
tbh,我当时看到这个答案还蛮懵的,什么鬼。于是去菜鸟教程学习了下相关内容C++ 中指向类的指针 | 菜鸟教程 (runoob.com)
一个指向C++类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。
下面的实例有助于更好地理解指向类的指针的概念:
#include <iostream>
using namespace std;
class Box
{
public:
// 构造函数定义
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
}
double Volume()
{
return length * breadth * height;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
int main(void)
{
Box Box1(3.3, 1.2, 1.5); // Declare box1
Box Box2(8.5, 6.0, 2.0); // Declare box2
Box *ptrBox; // Declare pointer to a class.
// 保存第一个对象的地址
ptrBox = &Box1;
// 现在尝试使用成员访问运算符来访问成员
cout << "Volume of Box1: " << ptrBox->Volume() << endl;
// 保存第二个对象的地址
ptrBox = &Box2;
// 现在尝试使用成员访问运算符来访问成员
cout << "Volume of Box2: " << ptrBox->Volume() << endl;
return 0;
}
我觉得上面的这个实例最重要的是“一个指向C++类的指针与指向结构的指针类似”,回到这道题,我们可以把pointer a理解为指向ALPHA,而这个ALPHA类含有x和y。现在又把这个指针赋给b作为BETA的指针,但是我们知道BETA除了可以访问ALPHA的x,y外,还有自己的z和rotate3D这个方法,所以答案会说*a might not be a BETA,它只是ALPHA,但是ALPHA和BETA是不同的。