看了这篇博客,将会学到C++的基本操作!(如果不敲代码,可能会一知半解)
12天学好C++ 系列(Day4) | chapter 5.参数传递,拷贝构造函数
第四天 -221002
目录
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 表。这就是浅拷贝构造函数中发生的情况。两个对象都将指向相同的内存位置。
浅拷贝复制对原始对象的引用。编译器提供了一个默认的复制构造函数。默认复制构造函数提供一个浅拷贝,如下例所示。它是对象的按位复制。
当类不处理任何动态分配的内存时,使用浅拷贝构造函数。
编辑
深拷贝构造函数
假如明天要提交作业,时间不够,所以你从朋友那里复制了它。现在您和您的朋友拥有相同的作业内容,但不同的副本。因此,在您的作业副本中所做的任何修改都不会反映在您朋友的副本中。这就是深拷贝构造函数中发生的事情。
深拷贝为拷贝的信息分配单独的内存。所以来源和副本是不同的。在一个内存位置所做的任何更改都不会影响另一个位置的副本。当我们使用指针分配动态内存时,我们需要用户定义的复制构造函数。这两个对象将指向不同的内存位置。
编辑
深拷贝的一般要求:
- 一个普通的构造函数。
- 用于删除动态分配的内存的析构函数。
- 复制构造函数,用于复制动态分配的内存。
- 重载的赋值运算符。
编辑