iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一起聊聊C++中的特殊成员函数
  • 602
分享到

一起聊聊C++中的特殊成员函数

2024-04-02 19:04:59 602人浏览 薄情痞子
摘要

目录一:背景二:特殊成员函数1. 默认构造函数2. 析构函数3. 赋值构造函数4. 赋值运算符一:背景 在C#中要说类默认给我们定义的特殊成员函数,莫过于构造函数,但在 c++ 中这

一:背景

C#中要说类默认给我们定义的特殊成员函数,莫过于构造函数,但在 c++ 中这样的特殊函数高达 6 种,有必要整合一下聊一聊。

二:特殊成员函数

1. 默认构造函数

和 C# 一样,很多书中都说,如果用户没有定义 构造函数,那么编译器会给我们定义一个,参考下面的例子:

class Person {

public:
	string name;
	int age;
};

int main()
{
	Person person;
}

接下来观察下汇编代码,看下有没有调用 默认构造函数 .

    Person person;
003E32EF  lea         ecx,[person]  
003E32F2  call        Person::Person (03E15EBh)

对于 C# 学习者来说有点懵哈,定义了就相当于new了, 哈哈,这是因为C++默认都是值类型哈,不过这里有必要澄清一下,并不一定所有情况都会调用默认构造函数,因为C++的汇编生成由各自 编译器 来决定,如果 编译器 觉得没必要调用构造函数 那它就会把这一步省掉来加速性能,那什么时候不会调呢? 参考如下代码。

class Person {

public:
	void show() {
		printf("show!");
	}
};

int main()
{
	Person person;
	person.show();
}

接下来看下汇编代码。

    person.show();
00E73F4F  lea         ecx,[person]  
00E73F52  call        Person::show (0E713B6h) 

可以清楚的看到,这种情况下调用构造函数其实没有必要,所以编译器就干脆省略了。

2. 析构函数

在C#中析构函数 是由CLR负责管理,在C++中没有托管这个概念,所以默认只能是结束作用域之前,自动调用析构函数释放,参考如下图:

3. 赋值构造函数

刚才也说到了,在 C++ 中甭管是 class 还是 struct 默认都是值类型,既然是值类型就存在stack copy 的情况,在 C# 中也是因为重写了 Equals 和 GetHashCode 来实现的值copy,接下来简单看下代码:

class Person {

public:
	string name;
	int age;
};

int main()
{
	Person p1 = { "jack",20 };
	Person p2(p1);
}

再看下 Person p2(p1) 的汇编代码。

    Person p2(p1);
000F80A2  lea         eax,[p1]  
000F80A5  push        eax  
000F80A6  lea         ecx,[p2]  
000F80A9  call        Person::Person (0F15C3h) 

从汇编中可以看到调用了 Person::Person (0F15C3h) 函数,请注意,这个不是构造函数,而是 赋值构造函数, 可以调试下去看看哦。。。 截图如下:

值得说一下的是,C++ 默认提供的赋值构造函数是浅copy,如果要实现深 copy 的话,或者有一些自定义的逻辑,建议自己实现一下。

class Person {

public:
	string name;
	int age;

public:
	Person(string name, int age) :name(name), age(age) {}
	Person(const Person& p) {
		name = p.name;
		age = p.age;
	}
};

int main()
{
	Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };
	Person p2(p1);
}

4. 赋值运算符

在 C# 中值类型, 匿名类型, Record 都是重写过 Equals 及 = 运算符,所以可以在这些类型上用 =, 其实在 C++ 中也可以在 class 之间进行赋值,因为编译器会帮我们重写运算符 = ,如何看出来呢?先看下代码:

class Person {

public:
	string name;
	int age;

public:
	Person(string name, int age) :name(name), age(age) {}
	Person(const Person& p) {
		name = p.name;
		age = p.age;
	}
};

int main()
{
	Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };
	Person p2 = { "bbbbbbbbbbbbbbbbbbbbbbbbbbb",22 };

	p2 = p1;
}

最后一句的 p2 = p1 之所以能成功是因为 = 被重写了,参考汇编代码。

    p2 = p1;
00FD967C  lea         eax,[p1]  
00FD967F  push        eax  
00FD9680  lea         ecx,[p2]  
00FD9683  call        Person::operator= (0FD161Dh) 

如果需要自定义,可以自己重写。

class Person {

public:
	string name;
	int age;

public:
	Person(string name, int age) :name(name), age(age) {}
	Person(const Person& p) {
		name = p.name;
		age = p.age;
	}
	Person& operator = (const Person& p) {
		name = p.name;
		age = p.age;
		return *this;
	}
};

int main()
{
	Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };
	Person p2 = { "bbbbbbbbbbbbbbbbbbbbbbbbbbb",22 };

	p2 = p1;
}

到此这篇关于一起聊聊C++中的特殊成员函数的文章就介绍到这了,更多相关C++ 特殊成员函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一起聊聊C++中的特殊成员函数

本文链接: https://www.lsjlt.com/news/154173.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一起聊聊C++中的特殊成员函数
    目录一:背景二:特殊成员函数1. 默认构造函数2. 析构函数3. 赋值构造函数4. 赋值运算符一:背景 在C#中要说类默认给我们定义的特殊成员函数,莫过于构造函数,但在 C++ 中这...
    99+
    2022-11-13
  • 一起聊聊C++中的智能指针
    目录一:背景二:关键词解析1. auto_ptr2. auto_ptr 多引用问题一:背景 我们知道 C++ 是手工管理内存的分配和释放,对应的操作符就是 new/dele...
    99+
    2022-11-13
  • 一起详细聊聊C#中的Visitor模式
    目录写在前面模式演进举个例子使用了Tpye-Switch的版本尝试使用重载的版本单分派与双分派Visitor模式总结写在前面 Visitor模式在日常工作中出场比较少,如果统计大家不...
    99+
    2022-11-13
  • 聊一聊C++虚函数表的问题
    之前只是看过C++虚函数表相关介绍,今天有空就来写代码研究一下。 面向对象的编程语言有3大特性:封装、继承和多态。C++是面向对象的语言(与C语言主要区别),所以C++也拥有多态的特...
    99+
    2022-11-12
  • 一起聊聊C++中的四种类型转换符
    目录一:背景二:理解四大运算符1. const_cast2. reinterpret_cast3. dynamic_cast3. static_cast一:背景 在玩 C 的时候,经...
    99+
    2022-11-13
  • C++特殊成员函数以及其生成机制详解
    目录前言默认构造函数数据成员初始化析构函数拷贝操作移动操作总结 前言 在C++中,特殊成员函数指的是那些编译器在需要时会自动生成的成员函数。C++98中有四种特殊的成员函数...
    99+
    2022-11-13
  • 简单聊聊C++中回调函数的实现
    目录前言1 函数指针2 C风格的回调函数3 C++风格的回调函数4 多态类型的回调函数5 通过function和bind实现回调函数功能6 总结前言 回调函数其实和普通函数一样,不同...
    99+
    2022-11-13
  • 聊聊C++中右值引用和移动构造函数的使用
    目录一: 背景二: 右值引用1. 它到底解决了什么问题2. 右值引用是个什么样子三: 右值引用如何减少对象的创建1. 简要思路2. 一个简单的例子3. 性能优化方案四: 总结一: 背...
    99+
    2022-11-13
  • C++中的类成员函数当线程函数
    目录类成员函数当线程函数解决方法一解决方法二解决方法三类成员函数作为多线程的入口类成员函数当线程函数 C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该...
    99+
    2022-11-13
    C++类成员函数 C++线程函数 C++成员函数
  • C++成员函数中const的使用详解
    目录修饰入参值传递址传递const修饰入参修饰返回值修饰函数总结const 在C++中是一个很重要的关键字,其不光可以用来修饰变量,还可以放在函数定义中,这里整理了其在函数中的三个用...
    99+
    2022-11-13
  • C++中类的默认成员函数详解
    目录一、构造函数二、析构函数三、拷贝构造函数四、赋值函数(赋值运算符重载)总结C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声明)—&md...
    99+
    2022-11-13
  • C++中的成员函数和友元函数怎么使用
    成员函数是定义在类中的函数,它可以访问类中的成员变量和其他成员函数。成员函数使用类的对象来调用,并且隐式地访问该对象的成员。友元函数...
    99+
    2023-08-16
    C++
  • C++中类的默认成员函数怎么用
    这篇文章主要介绍了C++中类的默认成员函数怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C++中,对于任意一个类,都会为我们提供4个默认的成员函数(如果我们不显示的去声...
    99+
    2023-06-29
  • C++中成员函数和友元函数的区别有哪些
    C++中成员函数和友元函数之间有以下几点区别:1. 访问权限:成员函数可以直接访问类的私有成员和保护成员,而友元函数可以在类的外部访...
    99+
    2023-08-16
    C++
  • C++类中的六大默认成员函数详解
    在C++中,当你去创建一个类的时候,即便这个类是空类,也会自动生成下面6个默认成员函数,在本篇博客中,我将逐一分析下面6个默认成员函数。 构造函数 构造函数并不是去构造函数的函数,...
    99+
    2022-11-12
  • C++类中六个默认的成员函数详解
    目录浅谈构造函数析构函数拷贝构造函数赋值重载函数const成员函数取地址及const取地址重载函数深挖 构造函数拷贝构造函数赋值运算符重载函数总结浅谈 先来说一下“this...
    99+
    2022-11-12
  • 详解C++中类的六大默认成员函数
    目录一、类的默认成员函数二、构造函数Date(形参列表)1、构造函数的函数名和返回值2、构造函数的调用3、构造函数的重载4、系统生成的默认构造函数5、系统生成的默认构造函数的作用6、...
    99+
    2022-11-13
    C++类默认成员函数 C++类六大默认成员函数 C++类成员函数
  • 将存储过程和函数与复制一起使用有哪些特殊的安全要求?
    实际上,MySQL 从服务器有权执行从主服务器的 MySQL 服务器二进制日志中读取的任何语句,因此使用带有复制的存储函数存在一些特殊的安全限制。如果一般情况下复制或二进制日志记录(用于时间点恢复的目的)处于活动状态,则 MySQL DBA...
    99+
    2023-10-22
  • C++中成员函数和友元函数的使用及区别详解
    为什么使用成员函数和友元函数 这个问题至关重要,直接影响着后面的理解: 程序数据: 数据是程序的信息,会受到程序函数的影响。封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一...
    99+
    2022-11-13
  • C++中如何将operator==定义为类的成员函数
    目录C++将operator==定义为类的成员函数C++对operator=进行重写总结C++将operator==定义为类的成员函数 Duree.h #ifndef _DUREE_...
    99+
    2023-01-28
    C++ operator C++类的成员函数 C++成员函数
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作