C++好难(8):C++中的继承

这篇具有很好参考价值的文章主要介绍了C++好难(8):C++中的继承。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.继承的概念及定义

🍉继承的概念

🍉 继承的定义:

🍒格式定义:

 🍒继承关系和访问限定符

🍒继承基类成员访问方式的变化

2.基类和派生类对象赋值转换

3.继承中的作用域:

4.派生类的默认成员函数

5.继承与友元

6.继承与静态成员

 7.复杂的菱形继承记菱形虚拟继承

🍉单继承

🍉多继承

 🍉菱形继承:

 🍉菱形继承问题:

🍉虚拟继承:

🍉菱形继承的原理:

🍒二义性和冗余的原因:

🍒虚拟继承的原理

 8.继承的总结

🍉组合与继承

🍒组合是什么?

🍒组合与继承的关系

9.有关继承的考点和问题:


1.继承的概念及定义

🍉继承的概念

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。

继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

举个例子:假如我们现在需要设计一个校园管理系统,那么我们肯定会设计很多不同的角色类来方便我们进行管理,比如学生类、老师类、辅导员类、保安类等等。

设计好之后,我们会发现,有些数据和方法是每个角色都有的,而有些则是每个角色独有的。

C++好难(8):C++中的继承,C++好难,c++,开发语言

如上设计中,姓名、电话是每个人都会有的。而学生有专业和学生ID、老师有老师的ID

这时我们就可以设计一个Person类,将姓名和电话都放进去,用学生和老师去继承它。

#include<iostream>
#include<string>
using namespace std;

//基类/父类
class person
{
public:
	void print()
	{
		cout << "name: " << _name << endl;
		cout << "name: " << _number << endl;
	}
protected:
	string _name;	//姓名
	int _number;	//电话
};
class student :public person
{
private:
	string _major;	//学生专业
	int _stID;		//学生ID
};	

class teacher :public person
{
private:
	int _teaID;		//老师ID
};

继承后父类的成员,_name,_number,print()都会变为子类的一部分(成员函数+成员变量)这里体现出了 student teacher 复用了 person 的成员

C++好难(8):C++中的继承,C++好难,c++,开发语言

🍉 继承的定义:

🍒格式定义:

如下格式:person 是父类,也称基类;student 是子类,也称派生类

C++好难(8):C++中的继承,C++好难,c++,开发语言

 🍒继承关系和访问限定符

C++好难(8):C++中的继承,C++好难,c++,开发语言

🍒继承基类成员访问方式的变化

C++好难(8):C++中的继承,C++好难,c++,开发语言

对于上面的表格,我们不用去硬记,只要记住:继承是按访问限定符最小的来取的

总结:

  • 1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
  • 2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
  • 3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。
  • 4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
  • 5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

2.基类和派生类对象赋值转换

  • (1)派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用
//基类
class Person
{
public:
	string _name; // 姓名
	string _sex; // 性别
	int _age; // 年龄
};

//派生类
class Student : public Person
{
public:
	int _id;
};

int main()
{
	Person p;
	Student s;

	s._name = "张三";
	s._sex = "男";
	s._age = 20;
	s._id = 8888;

	p = s; // 子类对象赋值给父类对象

	return 0;
}

通过调试可以看到,在子类定义的元素都传给了父类,但由于父类没有 _id 这个变量,所以就不会发生传递:

C++好难(8):C++中的继承,C++好难,c++,开发语言

这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去,如图:

C++好难(8):C++中的继承,C++好难,c++,开发语言

  • (2)父类对象可以通过  指针  或  引用  接受子类对象
//基类
class Person
{
public:
	string _name; // 姓名
	string _sex; // 性别
	int _age; // 年龄
};

//派生类
class Student : public Person
{
public:
	int _id;
};


int main()
{
	Student s;

	s._name = "张三";
	s._sex = "男";
	s._age = 20;
	s._id = 8888;
    
    Person& p = s    // 通过引用赋值
	Person* p = &s;  // 通过指针赋值

	return 0;
}
  • (3)基类对象不能赋值给派生类对象
//基类
class Person
{
public:
	string _name; // 姓名
	string _sex; // 性别
	int _age; // 年龄
};

//派生类
class Student : public Person
{
public:
	int _id;
};

int main()
{
	Person p;
	Student s;

	p._name = "张三";
	p._sex = "男";
	p._age = 20;

	s = p; 

	return 0;
}

C++好难(8):C++中的继承,C++好难,c++,开发语言

  • (4)基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。
//基类
class Person
{
public:
	string _name = "Edison"; // 姓名
	string _sex = "男"; // 性别
	int _age = 20; // 年龄
};

//派生类
class Student : public Person
{
public:
	int _id;
};

int main()
{
	Student s;
	
	Person* pp = &s;
	Student* ps1 = (Student*)pp;
	ps1->_id = 10;

	return 0;
}

 这种情况是可以赋值的

C++好难(8):C++中的继承,C++好难,c++,开发语言

但是必须是基类的指针是指向派生类对象时才是安全的。

这里基类如果是多态类型,
可以使用  RTTI(Run-Time Type Information) 的 dynamic_cast 来进行识别后进行安全转换。

3.继承中的作用域:

  • 1. 在继承体系中基类和派生类都有独立的作用域。
  • 2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。
  • 3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
  • 4. 注意在实际中在继承体系里面最好不要定义同名的成员。

代码示例:下面代码中的 Student_num Person _num 构成隐藏关系

// 基类
class Person
{
protected:
	string _name = "moyu"; // 姓名
	int _num = 369; // 身份证号
};

// 派生类
class Student : public Person
{
public:
	void Print()
	{
		cout << "姓名:" << _name << endl;
		cout << "学号:" << _num << endl;
	}
protected:
	int _num = 963; // 学号
};

int main()
{
	Student s1;
	s1.Print();

	return 0;
}

运行可以看到,访问的是子列中的 _num ,这时因为局部优先原则

C++好难(8):C++中的继承,C++好难,c++,开发语言

那如果我要访问父类的 _num呢?这时就可以用到作用域限定符::去显示的访问

// 基类
class Person
{
protected:
	string _name = "moyu"; // 姓名
	int _num = 369; // 身份证号
};

// 派生类
class Student : public Person
{
public:
	void Print()
	{
		cout << "姓名:" << _name << endl;
		cout << "学号:" << Person::_num << endl;
	}
protected:
	int _num = 963; // 学号
};

int main()
{
	Student s1;
	s1.Print();

	return 0;
}

C++好难(8):C++中的继承,C++好难,c++,开发语言

需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏

只需要函数名相同就可以!!!

// 基类
class A
{
public:
	void fun()
	{
		cout << "A::func()" << endl;
	}
};
// 派生类
class B : public A
{
public:
	void fun(int i)
	{
		cout << "B::func()" << endl;
	}
};

int main()
{
	B b;
	b.fun(1);

	A a;
	a.fun();

	return 0;
}

如果要调用父类的,还是需要指定作用域

b.A::fun();

4.派生类的默认成员函数

派生类的默认成员函数共有6个,“默认”的意思就是我们不写,编译器也会自动生成一个,如图:

C++好难(8):C++中的继承,C++好难,c++,开发语言

这几个成员函数的生成规则如下:

  • 1)派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。
    如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。
  • 2)派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
  • 3)派生类的operator=必须要调用基类的operator=完成基类的复制。
  • 4)派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。
    因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
  • 5)派生类对象初始化先调用基类构造再调派生类构造。
  • 6)派生类对象析构清理先调用派生类析构再调基类的析构。

基类成员函数:

// 基类
class Person
{
public:
    // 构造函数
    Person(const char* name = "moyu")
        : _name(name)
    {
        cout << "Person()" << endl;
    }

    // 拷贝构造
    Person(const Person& p)
        : _name(p._name)
    {
        cout << "Person(const Person& p)" << endl;
    }

    // 赋值重载
    Person& operator=(const Person& p)
    {
        cout << "Person operator=(const Person& p)" << endl;
        if (this != &p)
            _name = p._name;

        return *this;
    }

    // 析构函数
    ~Person()
    {
        cout << "~Person()" << endl;
    }
protected:
    string _name; // 姓名
};

派生类成员函数:

// 派生类
class Student : public Person
{
public:
    // 构造函数
    Student(const char* name, int num)
        : Person(name) // 父类的成员必须去调父类的构造函数去初始化
        , _num(num)
    {
        cout << "Student()" << endl;
    }

    // 拷贝构造
    Student(const Student& s)
        : Person(s)
        , _num(s._num)
    {
        cout << "Student(const Student& s)" << endl;
    }

    // 赋值重载
    Student& operator = (const Student& s)
    {
        cout << "Student& operator= (const Student& s)" << endl;
        if (this != &s)
        {
            Person::operator =(s);
            _num = s._num;
        }
        return *this;
    }

    // 析构函数
    ~Student()
    {
        cout << "~Student()" << endl;
    }
protected:
    int _num; //学号
};

注意:子类析构函数不需要去调用父类的析构,因为父子类的析构函数存在隐藏关系!

因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同。

那么编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加 virtual的情况下,子类析构函数和父类析构函数构成隐藏关系。

C++好难(8):C++中的继承,C++好难,c++,开发语言

5.继承与友元

友元关系不能继承,
也就是说基类友元不能访问子类私有和保护成员

class Student;

class Person
{
public:
	// 友元函数声明
	friend void Display(const Person& p, const Student& s);
protected:
	string _name; // 姓名
};

class Student : public Person
{
protected:
	int _stuNum; // 学号
};

//友元函数定义
void Display(const Person& p, const Student& s)
{
	cout << p._name << endl; // 可以访问父类的私有和保护
	cout << s._stuNum << endl; // 无法访问子类的
}

int main()
{
	Person p;
	Student s;
	Display(p, s);

	return 0;
}

6.继承与静态成员

如果基类中定义了 static 静态成员,则整个体系里面只有一个这样的成员。无论派生类出了多少个子类,都只有一个 static 成员。

大家可以看看下面的代码:

// 基类
class Person
{
public:
	Person() 
	{ 
		++_count; 
	}
	static int _count; // 统计人的个数。

//protected:
	string _name; // 姓名
};

// 静态成员在类外面定义
int Person::_count = 0;

// 派生类
class Student : public Person
{
protected:
	int _stuNum; // 学号
};

int main()
{
	Person p;
	Student s;

	cout << &(p._name) << endl;
	cout << &(s._name) << endl;

	cout << endl;

	cout << &(p._count) << endl;
	cout << &(s._count) << endl;

	cout << endl;

	cout << " 人数 :" << Person::_count << endl;
	Student::_count = 0;
	cout << " 人数 :" << Person::_count << endl;

	return 0;
}

C++好难(8):C++中的继承,C++好难,c++,开发语言

通过地址可以清晰的看到,父类成员和子类成员不是同一个,而在被 static 定义的静态成员都始终是同一个

 7.复杂的菱形继承记菱形虚拟继承

🍉单继承

一个子类只有一个直接父类时称这个继承关系为单继承

C++好难(8):C++中的继承,C++好难,c++,开发语言

🍉多继承

一个子类有两个或以上直接父类时称这个继承关系为多继承

C++好难(8):C++中的继承,C++好难,c++,开发语言

 🍉菱形继承:

菱形继承是多继承的一种特殊情况

 C++好难(8):C++中的继承,C++好难,c++,开发语言

 🍉菱形继承问题:

菱形继承会产生数据冗余和数据的二义性问题。

从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。

C++好难(8):C++中的继承,C++好难,c++,开发语言

// 基类
class Person
{
public:
	string _name; // 姓名
	int _a[10000];
};


class Student :  public Person
{
protected:
	int _num; //学号
};
class Teacher :  public Person
{
protected:
	int _id; // 职工编号
};


//形成菱形继承
class Assistant : public Student, public Teacher
{
protected:
	string _majorCourse; // 主修课程
};



int main()
{
	Assistant a;
    // 这样会有二义性无法明确知道访问的是哪一个
	a._name = "moyu";    // 出错

	// 显示指定访问哪个父类的成员
	a.Student::_name = "a";
	a.Teacher::_name = "b";


	return 0;
}

虽然这样可以解决二义性的问题,但任然不能解决数据冗余的问题。
因为 Assistant 的对象在 Person 成员始终会存在两份

通过查看其地址就可以看出:

C++好难(8):C++中的继承,C++好难,c++,开发语言

🍉虚拟继承:

虚拟继承用来解决菱形继承的二义性和数据冗余的问题

C++好难(8):C++中的继承,C++好难,c++,开发语言

如图的继承关系,如下代码,在 Student 和 Teacher 继承 Person 时使用虚拟继承,即可解决问题。需要注意:虚拟继承不要再其他地方使用

class Person
{
public:
	string _name; // 姓名
};


class Student : virtual public Person
{
protected:
	int _num; //学号
};
class Teacher : virtual public Person
{
protected:
	int _id; // 职工编号
};


class Assistant : public Student, public Teacher
{
protected:
	string _majorCourse; // 主修课程
};

int main()
{
	Assistant a;
	a._name = "moyu";

	return 0;
}

我们现在可以打印地址看看:

C++好难(8):C++中的继承,C++好难,c++,开发语言

 可以看到,此时不管是继承 Student 的 _name 还是继承 Teacher 的 _name 都是指向同一块区域,是同一个变量

🍉菱形继承的原理:

为了研究虚拟继承原理,我们先用一个简化的菱形继承继承体系,再借助内存窗口观察对象成 员的模型。

🍒二义性和冗余的原因:

C++好难(8):C++中的继承,C++好难,c++,开发语言

class A
{
public:
	int _a;
};

class B : public A
{
public:
	int _b;
};

class C : public A
{
public:
	int _c;
};

class D : public B, public C
{
public:
	int _d;
};

int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;

	return 0;
}

C++好难(8):C++中的继承,C++好难,c++,开发语言

可以看到 d 对象中有两个 _a 成员,这就是菱形继承导致的二义性和冗余的原因

🍒虚拟继承的原理

C++好难(8):C++中的继承,C++好难,c++,开发语言

 添加虚拟继承后的结果:

class A
{
public:
	int _a;
};

class B : virtual public A
{
public:
	int _b;
};

class C : virtual public A
{
public:
	int _c;
};

class D : public B, public C
{
public:
	int _d;
};

int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;

	return 0;
}

C++好难(8):C++中的继承,C++好难,c++,开发语言

其中偏移量的指针也叫做虚基表

也可以看看下图更清楚的解释

 C++好难(8):C++中的继承,C++好难,c++,开发语言

 8.继承的总结

  • 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。
  • 多继承可以认为是C++的缺陷之一,很多后来的面向对象的语言都没有多继承,如Java。
     

🍉组合与继承

🍒组合是什么?

class A
{};

class B 
{
private:
	C _c;
};

上面的代码就是一个组合,也就是再一个类里面创建另一个类的对象

🍒组合与继承的关系

继承的父类与子类是一种   is - a   的关系。也就是说每个子类对象都是一个父类对象。

组合是一种   has - a   的关系。假设 B 组合了 A ,每个 B 对象中给都有一个 A 对象。

举例说明:

跑车 和 兰博基尼 就构成   is - a 的关系,所以可以使用继承

// 跑车
class Scar
{
protected:
	string _colour = "黑色"; // 颜色
	string _num = "AE86"; // 车牌号
};

// 兰博基尼
class lbjn : public Scar
{
public:
	void Drive()
	{
		cout << "帅" << endl;
	}
};

汽车 和 轮胎 之间的关系就是   has - a    的关系,他们之间更适用于组合关系

// 轮胎
class Tire 
{
protected:
	string _brand = "Michelin"; // 品牌
	size_t _size = 17; // 尺寸

};

// 汽车
class Car 
{
protected:
	string _colour = "黑色"; // 颜色
	string _num = "AE86"; // 车牌号
	Tire _t; // 轮胎
};

注意:如果两者的关系既适用于组合   has - a    的关系,有适用于继承   is - a 的关系,那么建议使用对象的组合,而不是类的继承

为什么呢?原因如下:

  • 继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。
  • 对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。对象组合要求被组合的对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse),因为对象的内部细节是不可见的。对象只以“黑箱”的形式出现。组合类之间没有很强的依赖关系,耦合度低。优先使用对象组合有助于你保持每个类被封装。
  • 实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就用组合。

注意:模块与模块之间的关系应该遵循:低耦合,高内聚!

9.有关继承的考点和问题:

1. 什么是菱形继承?菱形继承的问题是什么?

2. 什么是菱形虚拟继承?如何解决数据冗余和二义性的?

3. 继承和组合的区别?什么时候用继承?什么时候用组合?文章来源地址https://www.toymoban.com/news/detail-538230.html

到了这里,关于C++好难(8):C++中的继承的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++中的继承(二)

    上一篇文章我们C++的正常继承其实已经讲完了,但是后面还有一个大坑。 实际当中继承有单继承和多继承。 单继承就是直接继承一个类。 只有一个直接父类的就叫做单继承。 如果是单继承那就比较简单。 现实世界除了有单继承还有多继承。 多继承就是我一个类我具备另外

    2024年02月04日
    浏览(31)
  • C++中的继承(一)

    我们之前说过,继承是面向对象的三大特性。 面向对象的三大特性: 封装、继承、多态。 封装在类和对象体现出。 继承是什么? 继承就是一种类层次的复用,复用就是你的就变成我的. 假设我要实现一个管理系统。 如果按照以前类和对象的方式,单独去实现这个类是很坑的.

    2024年02月03日
    浏览(35)
  • C++好难(4):类和对象(下)

    okk我们终于来到了C++类和对象的最后一节,大多都是对之前学习的内容做的补充 所以加油继续冲啦!        ∧_∧::    (´・ω・`)::   /⌒ ⌒)::  /へ__  / /:: (_\\  ミ)/::  | `-イ::  /  y  ):: //  /:: / /:: ( く::: |\ ヽ::: 再谈构造函数 Static成员 友元 内部类 匿名对

    2024年02月03日
    浏览(38)
  • C++ 中的继承和多态

    继承允许我们 依据一个类来定义另一个类 ,这使得创建和维护一个应用程序变得更容易。这样做也达到了重用代码功能和提高执行效率的效果。 派生类的成员可以直接访问基类的保护成员(protected),但不能直接访问基类的私有成员(private) 。不过需要注意的是,派生类

    2024年02月06日
    浏览(42)
  • C++中的继承和派生

    C++ 中的继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。 继承(Inheri tan ce) 可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数。 在C++中,

    2024年02月10日
    浏览(40)
  • C++中的继承(超详细)

    继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复

    2024年02月07日
    浏览(30)
  • [开发语言][python][c++]:C++中的this指针和Python中的Self -- 26岁生日

    以朋友的新岁祝福开篇,祝笔者也祝大家☺️: 之前一直对 C++ 中的 this 和 python 中的 self 到底是什么关系,为什么 C++ 要显式的写出来,python 则不需要? 模糊不清,趁着周末整理一下相关结论,希望本篇文章可以解答这些问题,同时对C++和Python中的类加深些理解。 python 当

    2024年01月24日
    浏览(71)
  • 【C++进阶之路】第一篇:C++中的继承

    🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【C++学习与应用】 ✒️✒️本篇内容:继承的基础概念,定义方法,基类和派生类的转换,继承中类的作用域,什么是隐藏,派生类和默认成员函数,继承和友元,继承与静态函数,菱形继承和虚拟继承,菱形继承总结

    2024年02月02日
    浏览(41)
  • C++中的继承、以及赋值兼容转换。

    一、继承的概念及定义 继承可以使代码复用,允许在保持原有类特性的基础上进行扩展。 举个例子:就好比我现在要封装老师、学生等这些人的属性和方法,但是这些人都有重复的属性和方法,比如name、age、sex等等,那么我可以封装一个人的属性和方法,然后我用老师、学

    2024年02月05日
    浏览(36)
  • [开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

    写在前面 :Python和C++中的赋值与深浅拷贝,由于其各自语言特性的问题,在概念和实现上稍微有点差异,本文将这C++和Python中的拷贝与赋值放到一起,希望通过对比学习两语言实现上的异同点,加深对概念的理解。 C++中所谓的 浅拷贝 就是由(系统默认的) 拷贝构造函数对

    2024年02月02日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包