C++ | 12天学好C++ (Day4)->结构图可视化、代码加通俗理解

看了这篇博客,将会学到C++的基本操作!(如果不敲代码,可能会一知半解)

12天学好C++ 系列(Day4) | chapter 5.参数传递,拷贝构造函数


第四天 -221002

目录

5.函数、参数传递,copy

5.1.参数传递argument passing

5.2.拷贝构造函数copy constructor


5.参数传递,拷贝构造函数

5.1.参数传递argument passing

参数传递方式:

  • 按值调用call by value:C++默认按值传递,将实际参数的值复制到形式参数,由于它执行的是实际参数的副本,因此函数的执行不会影响调用者拥有的实际参数的值。
  • 参考调用call by reference:可以通过使用指针运算符手动实现引用调用。
  • 指针调用call by  pointer:通过指针调用将参数传递给函数的方法,将参数的地址复制到形式参数中,在函数内部,地址用于访问调用中使用的实际参数。这意味着对参数所做的更改会影响传递的参数。为了通过指针传递值,参数指针被传递给函数,就像其他值一样。所以将函数参数申明为指针类型,交换其参数指向的俩个整数变量的值。

 图片来自【5】

示例1:

#include<iostream>
#include<string>
using namespace std;
//1
void swap(int a,int b) {
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}
int main() {
	int m = 2,n=9;
	swap(m, n);
	cout << m << ' ' << n << endl;


}

 结果:

 在上面示例中,交换前后m和n的值相同,因为为了执行函数的代码,将实参的值复制到形参,由于它处理的是实际参数的副本,因此函数的执行不会影响调用者拥有的实际参数的值。

#include<iostream>
#include<string>
using namespace std;
//2
void swap(int *a,int *b) {
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}
int main() {
	int m = 2,n=9;
	swap(&m, &n);
	cout << m << ' ' << n << endl;


}

 结果:

- Swap():交换两个变量的值.

- 指针是一个变量,它存储另一个变量的地址,而参考调用是一个引用另一个变量的变量,使用指针来实现算法和数据结构。

示例2:

#include<iostream>
#include<string>
using namespace std;
class Circle {
private:
	int radius;
public:
	Circle();
	Circle(int r);
	~Circle();
	double getArea() { return 3.14 * radius * radius; }
	int getRadius() { return radius; }
	void setRadius(int radius) { this->radius=radius; }
};
Circle::Circle() {
	radius = 1;
	cout << "using radius=" << radius << endl;
}
Circle::Circle(int radius) {
	this->radius = radius;
	cout << "using radius=" << radius << endl;
}
Circle::~Circle() {
	cout << "xigou radius=" << radius << endl;
}
void increase(Circle c) {
	int r = c.getRadius();
	c.setRadius(r + 1);
}
int main() {
	Circle waffle(30);
	increase(waffle);
	cout << waffle.getRadius() << endl;


}

 第一次在析构函数中定义radius=1结果:

 改正后

 5.2.拷贝构造函数copy constructor

Copy Constructors是一种构造函数,用于创建已存在的类类型对象的副本。它通常采用X (X&)的形式,其中 X 是类名。编译器为所有类提供了一个默认的复制构造函数。

#include<iostream>
using namespace std;
class Samplecopyconstructor
{
    private:
    int x, y;   //data members
    
    public:
    Samplecopyconstructor(int x1, int y1)
    {
        x = x1;
        y = y1;
    }
    
    /* Copy constructor */
    Samplecopyconstructor (const Samplecopyconstructor &sam)
    {
        x = sam.x;
        y = sam.y;
    }
    
    void display()
    {
        cout<<x<<" "<<y<<endl;
    }
};
/* main function */
int main()
{
    Samplecopyconstructor obj1(10, 15);     // Normal constructor
    Samplecopyconstructor obj2 = obj1;      // Copy constructor
    cout<<"Normal constructor : ";
    obj1.display();
    cout<<"Copy constructor : ";
    obj2.display();
    return 0;
}

贝构造函

通过一个例子来解释浅拷贝构造函数的概念。两名学生正在通过网络共享的两台不同机器同时在 Excel 表中输入他们的详细信息。他们俩所做的更改将反映在excel表中。因为在两个位置都打开了相同的 Excel 表。这就是浅拷贝构造函数中发生的情况。两个对象都将指向相同的内存位置。

贝复原始象的引用。编译器提供了一造函。默认复造函提供一个浅,如下例所示。象的按位制。

当类理任何动态分配的,使用贝构造函

​​编辑

深拷贝构造函

假如明天要提交作时间,所以你从朋友那里制了的朋友有相同的作业内容,但不同的副本。因此,在的作副本中所做的任何修改都不反映在朋友的副本中。就是深拷贝构造函生的事情。

深拷贝为的信息分配单独存。所以源和副本是不同的。在一个内存位置所做的任何更改都不另一位置的副本。使用指分配动态内,我需要用造函这两个对指向不同的存位置。

​​编辑

深拷的一般要求:

  • 一个普通的构造函数。
  • 用于删除动态分配的内存的析构函数。
  • 复制构造函数,用于复制动态分配的内存。
  • 重载的赋值运算符。

​​编辑


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天|여름이다

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值