2021-3-20 第八天
C++内容学习
w3school -> C++ -> 面向对象
网址:https://www.w3cschool.cn/cpp/cpp-data-structures.html
一)C++类&对象
#类中成员函数要用到类中成员时,不需要在括号里声明参数,直接调用即可
类中成员:
public、private、protected
public可以直接通过对象调用,当然也可以通过公有函数调用
可通过成员函数修改它的值
private可以通过友元函数和类中成员函数调用
初始化放在构造函数中
可通过成员函数修改它的值
#类中的private不能在函数中直接被对象调用,只能通过成员函数调用
protected可以在派生类(子类)中被访问
其他均与private类似
派生类示例:SmallBox
class Box{
…
}
class SmallBox:Box{
…
}
构造函数&析构函数
1、构造函数(会在每次创建类的新对象时执行)
它的名称与类的名称相同,不会返回任何类型
可用于某些成员变量设置初始值
默认的构造函数没有任何参数,但如果需要,也可以带有参数。
这时在创建对象时就会给对象赋初始值。
构造函数格式:(class Line)
①不声明,使用系统默认构造函数
②在类中声明,定义,不带参数,不对成员进行初始化
class Line{
public:
Line();
…
}
③在类中声明,在外面定义,带参数,对成员初始化
class Line{
public:
Line(double len);
…
}
Line::Line(double len){
…
}
③在类中声明、定义,带参数,对成员初始化
class Line{
public:
Line(double len){
…
}
…
}
④在类中声明,不定义,带参数,直接对成员初始化
class Line{
public:
Line(double len, double wid):length(len), width(wid){}
…
private:
double length;
double width;
…
}
2、析构函数(会在每次删除所创建对象时执行)
析构函数不会返回任何值,也不带有任何参数
它有助于跳出程序(比如关闭程序、释放内存等)前释放资源
C++拷贝构造函数
类对象的拷贝
class CExample{
…
}
CExample A(100);
CExample B = A;
#这里的对象初始化,要调用拷贝构造函数,而非赋值
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
它通常用于:
通过使用另一个同类型的对象来初始化新创建的对象
复制对象把它作为参数传递给函数
复制对象,并从函数返回这个对象
如果类中没有定义拷贝构造函数,编译器会自行定义一个
拷贝构造函数的最常见形式:
class Line{
public:
…
Line(int len);
Line(const Line &obj);
…
}
Line::Line(int len){
//为指针分配内存
ptr=new int;
*ptr = len;
}
Line::Line(const Line &obj){
ptr = new int;
*ptr = *obj.ptr; //copy the value
}
Line line1(10);
Line line2 = line1;
友元函数:定义在类外面,但有权访问所有private、protected成员的函数
友元可以是一个函数(友元函数),友元也可以是一个类(友元类)整个类及其成员都是友元
声明:在函数原型前使用关键字 friend
#注:虽然这个函数不是类的成员函数,但也需要用friend声明在类中
如:
class Box{
public:
friend void printWidth(Box box);
…
}
void printWidth(Box box){
…
}
指向类的指针
class Box{
public:
double Volume();
…
}
Box box;
Box *ptrBox;
ptrBox = &box;
cout<<box.Volume<<endl;
cout<<ptrBox->Volume<<endl;
#指针用->调用成员函数
#对象用.调用成员函数
类中静态成员和静态成员函数
class Box{
public:
static int objectCount;
…
static int getCount(){
return objectCount;
}
…
}
int Box::objectCount = 0;
//在类的外部,用类名+范围解析式::进行初始化
int main(){
Box box1;
Box box2;
cout<<”Total objects:”<<Box::objectCount<<endl;
//用类名+范围解析式::进行访问
return 0;
}
静态成员函数只能访问静态数据成员
#即使在类对象不存在的情况下也能被调用
通过类名+::可直接进行访问
二)C++继承
已有的类称为基类,新建的类称为派生类
一个类可以派生自多个类,这意味着它可以从多个基类继承数据和函数
class Shape{
…
}
class Rectangle:public Shape{
…
}
派生类可以访问基类中所有非私有成员(public和protected)
因此:如果基类成员如果不想被派生类的成员函数访问,可以声明为private
访问权限总结:
同一个类:public、protected、private
派生类:public、protected
外部的类:public
一个派生类继承了几乎所有基类方法,除以下几种情况:
- 基类的构造函数、析构函数和拷贝构造函数
- 基类的重载运算符
- 基类的友元函数
继承类型:
当一个类派生自基类时,该基类可以被继承为public、protected或private
#几乎不使用protected和private继承,通常使用public继承
当一个类派生自公有基类(public)时,基类的公有成员也是派生类的公有成员,保护成员还是保护成员,私有成员不能直接被派生类访问(但可以通过调用基类的公有和保护成员来访问)
多继承:
多继承即一个子类有多个父类,它继承了多个父类的特性
语法:
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…{
…
};
例:
class Rectangle: pubCostlic Shape, public Paint{
public:
int getArea(){
return (width * height);
}
};
int main(){
Rectangle Rect;
int area;
Rect.setWidth(5);
area = Rect.getArea();
return 0;
}