2021—研一学习笔记 day 8

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值