【C++系列经典例子】C++默认构造,拷贝,赋值,析构四函数


本例子来自于学习视频,不是原创。

首先,我们已经知道我们创建类时会有四个默认函数(实际是有6个,具体以后再探究)

分别是:(以test类为例子)

class test

{

private:

int value;

}

1.构造函数:

test(int x=0)

2.拷贝构造函数:

test(const test& it)

3.赋值函数

test &operator(const test& it)

4.析构函数

~test()

以下是具体应用四个函数的过程的一个经典例子,能让我们更好的理解这四个函数的应用

代码如下:

#include<iostream>

using namespace std;

class Test
{
private:
 int value;
public:
 Test()
 {
  value = 0;
  cout << "defult create Test:" << this << endl;
 }
 Test(int t)
 {
  value = t;
  cout << "Create the Test:" << this << endl;
 }

 Test (const Test& it)
 {
  value = it.value;
  cout << "Copy create the test:" << this << endl;
 }

 Test & operator=(const Test& it)
 {
  value = it.value;
  cout << this << " = " << &it << endl;
  return *this;
 }
 ~Test()
 {
  cout << "Destory the Test:" << this << endl;
 }

 int get_value()
 {
  return value;
 }
};

Test fun(Test tp)
{
 int x = tp.get_value();
 Test tmp(x);
 return tmp;
}

int main()
{
 Test t1(10);
 Test t2;
 //Test t3();  //虽然没错,但是创建不了对象,因为规定是若要
    //调用默认的构造函数,则不需要括号,用括号会变成函数声明;
 t2 = fun(t1);

 cout << "main end!" << endl;

 return 0;
}

执行的结果分析:

关键点在于:

1.传递t1给形参时的过程

2.返回tmp实参的过程

后续的补充:

fun()函数并不是最优的方法函数,在空间和时间上进行优化:

<pre name="code" class="cpp">/*1未优化前
Test fun(Test tp)//传值操作浪费时间和空间,所以换为引用
{
	int x = tp.get_value();
	Test tmp(x);
	return tmp;
}
*/

/*2对参数传递的优化
Test fun(const Test& tp)//传值操作浪费时间和空间,所以换为引用
						//且由于tp不能改变,我们可以加上const。这样可以明显减少时间空间上
{
	int x = tp.get_value();
	Test tmp(x);
	return tmp;
}
*/
//3对返回值的优化
Test fun(const Test & tp)
{
	int x = tp.get_value();
	//Test tmp(x);
	//return tmp;
	return Test(x);  //这里直接调用构造函数来进行构造一个无名对象进行传值,
					//这样系统就不会再创建一个临时变量来存储对象进行传值操作
}
				
时间: 2024-08-27 22:28:35

【C++系列经典例子】C++默认构造,拷贝,赋值,析构四函数的相关文章

复制构造函数和析构函数经典例子

#include<iostream> using namespace std; class A { public: A() { cout<<"this is construction"<<endl; } virtual ~A() { cout<<"this is destruction"<<endl; } }; A fun() { A a; return a; } int main() { { A a; a

含有指针变量的类需要重写拷贝构造函数,拷贝赋值函数,析构函数

编译器自带拷贝构造(ctor)和拷贝赋值函数(operator =), 但是对于成员变量含有指针的类,其不能使用默认的拷贝赋值函数.因为使用默认的,会直接将指针指向的地址进行赋值 (浅拷贝,共享内存,共指一个对象),而不是分配一块内存,具有相同的数值 (深拷贝,独立,两个对象). 浅拷贝容易造成dangling pointer. 用一个例子来展示: 1 #ifndef __MYSTRING__ 2 #define __MYSTRING__ 3 4 class String{ 5 public:

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

C++之拷贝构造与拷贝赋值

拷贝构造和拷贝赋值------一个有点难的问题 介绍之前,我们需要首先了解深拷贝与浅拷贝的差异: 何为深拷贝,深拷贝不会复制指针,而是令目标对象拥有独立的资源,该资源是从元对象中复制,即先找到对象的指针,在通过指针拷贝其内容: 何为浅拷贝,即之赋值指针的地址,不会赋值指针的目标,容易引发double free异常,即多个目标指向同一个内存: 缺省拷贝构造函数和缺省拷贝赋值函数 如果一个类没有显示的定义一个拷贝构造函数和拷贝赋值运算符,则编译器会为其默认提供一个,但是这个函数只能进行浅拷贝: 如果

C++基本函数的调用优化(构造、拷贝构造、赋值)

合理的函数可提升时间和空间的利用率 //Test1.h #include<iostream> using namespace std; struct ST { private: int a; short b; public: ST(int a=0, short b=0):a(a),b(b) { this->a = a; this->b = b; cout<<"Object was Built. "<<this<<endl; }

递归的几个经典例子

注意:构造方法不可递归,否则是无限创建对象; 递归的几个经典例子: 1.HannoiTower 1 import java.util.Scanner; 2 public class HanoiTower{ 3 //level代表盘子个数;三个char类型代表柱子 4 public static void moveDish(int level, char from, char inter, char to){ 5 if(level == 1){ 6 System.out.println("从&qu

小猪的数据结构辅助教程——2.5 经典例子:约瑟夫问题的解决

小猪的数据结构辅助教程--2.5 经典例子:约瑟夫问题的解决 标签(空格分隔): 数据结构 约瑟夫问题的解析 关于问题的故事背景就不提了,我们直接说这个问题的内容吧: 一堆人,围成一个圈,然后规定一个数N,然后依次报数,当报数到N,这个人自杀,其他人鼓掌!啪啪啪, 接着又从1开始报数,报到N又自杀-以此类推,直到死剩最后一个人,那么游戏结束! 这就是问题,而我们用计算机模拟的话,用户输入:N(参与人数),M(第几个人死),结果返回最后一个人! 类似的问题有跳海问题,猴子选王等,下面我们就以N =

信号量基础和两个经典例子

信号量基础和两个经典例子 信号量(semaphore) 用于进程中传递信号的一个整数值. 三个操作: 1.一个信号量可以初始化为非负值 2.semWait操作可以使信号量减1,若信号量的值为负,则执行semWait的进程被阻塞.否则进程继续执行. 3.semSignal操作使信号量加1.若信号量的值小于等于0,则被semWait操作阻塞的进程讲被接触阻塞. ps: semWait对应P原语,semSignal对应V原语. 信号量以及PV原语的C语言定义如下 struct semaphore {