首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++】匿名对象 ③ ( 函数返回值为对象 匿名对象 拷贝构造函数 与 析构函数 调用情况分析 )

一、匿名函数 与 拷贝构造函数 1、匿名函数回顾 在上一篇博客 【C++】匿名对象 ② ( 将 “ 匿名对象初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 ) 中 , 分析了匿名函数几种用法..., 以及不同使用场景下 , 匿名对象 创建与销毁情况 ; C++ 编译器 发现 使用 匿名对象 , 会根据 匿名对象 用法 , 决定对 匿名对象 处理 ; 匿名对象单独使用 : 如果只是单纯使用...赋值 , 此时 编译器 会将 匿名对象 值赋值给 已存在变量 , 并且立刻销毁该匿名对象 ; 2、拷贝构造函数回顾 在 【C++】拷贝构造函数调用时机 ① ( 使用一个对象初始化另外一个对象 |...Student fun() { Student s1(18, 170); return s1; } 二、当函数返回值为对象情况分析 ---- 1、函数返回对象返回值为匿名对象 如果一个 函数返回值...是 类对象值 类型 , 不是 类对象 引用 或 指针 类型 , 返回 返回值 是一个 匿名对象 ; // 函数返回值是 Student 类型对象 Student fun() { Student

24020

C++类自动提供特殊成员函数

例如:StringBad(const StringBad&); 新建⼀个对象并将其初始化为同类现有对象,复制构造函数都将被调⽤。最常⻅情况是将新对象显式地 初始化为现有的对象。...& StringBad::operator=(const StringBad &); ``` 赋值运算符功能及何时调用: 将已有的对象赋给另⼀个对象,将使⽤重载赋值运算符: StringBad...StringBad metoo=knot; metoo是⼀个新创建对象,被初始化为knot值,因此使⽤复制构造函数。...(即程序运行后,该目标对象将不再指向此内存位置,这将导致内存浪费。) 函数应当避免将对象赋给⾃⾝;否则,给对象重新赋值前,释放内 存操作可能删除对象内容。 函数返回⼀个指向调⽤对象引⽤。...赋值操作并不创建新对象,因此不需要调整静态数据成员 num_strings值。 地址运算符:

68310
您找到你想要的搜索结果了吗?
是的
没有找到

开心档之C++ 动态内存

C++ 中,您可以使用特殊运算符为给定类型变量在运行时分配堆内内存,这会返回所分配空间地址。这种运算符即 new 运算符。...如果您不再需要动态分配内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配内存。...我们可以按照下面的语句使用 new 运算符来完成这点: double* pvalue = NULL; // 初始化为 null 指针 pvalue = new double; // 为变量请求内存...个字符字符串)分配内存,我们可以使用上面实例中语法来为数组动态地分配内存,如下所示: char* pvalue = NULL; // 初始化为 null 指针 pvalue = new char...return 0; } 如果要为一个包含四个 Box 对象数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象,析构函数也将被调用相同次数(4次)。

40520

C++】构造函数初始化列表 ① ( 类对象作为成员变量构造函数问题 | 构造函数初始化列表语法规则 )

一、类对象作为成员变量构造函数问题 1、问题描述 如果 一个类 A 对象 作为 另外一个类 B 成员变量 , 在以下场景会报错 : 为类 A 定义 有参 构造函数 , 那么 A 无参默认构造函数就失效了...无参构造函数创建 A 对象 , 但是 A 无参构造函数无法使用 , 必须使用 A 有参构造函数 , 这里就出现问题 , 报错 “B::B(void)”: 由于 数据成员“B::m_a”不具备相应...默认构造函数 或重载解决不明确,因此已隐式删除函数 ; class B { public: int m_age; // 年龄 A m_a; // A 类型成员变量 }; 解决上述问题方案...就是 C++ 构造函数 初始化列表 ; 2、错误代码示例 代码示例 : #include "iostream" using namespace std; class A { public: /...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 在 C++ 语言中 , 构造函数初始化列表

47130

C++ 动态内存

C++ 中,您可以使用特殊运算符为给定类型变量在运行时分配堆内内存,这会返回所分配空间地址。这种运算符即 new 运算符。...如果您不再需要动态分配内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配内存。...我们可以按照下面的语句使用 new 运算符来完成这点: double* pvalue = NULL; // 初始化为 null 指针pvalue = newdouble; // 为变量请求内存...在任何时候,当您觉得某个已经动态分配内存变量不再需要使用时,您可以使用 delete 操作符释放它所占用内存,如下所示: delete pvalue;// 释放 pvalue 所指向内存 下面的实例中使用了上面的概念...return 0; } 如果要为一个包含四个 Box 对象数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象,析构函数也将被调用相同次数(4次)。

68310

如何进行C++动态转换

C++ 中,您可以使用特殊运算符为给定类型变量在运行时分配堆内内存,这会返回所分配空间地址。这种运算符即 new 运算符。...如果您不再需要动态分配内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配内存。...我们可以按照下面的语句使用 new 运算符来完成这点: double* pvalue = NULL; // 初始化为 null 指针 pvalue = new double; // 为变量请求内存...个字符字符串)分配内存,我们可以使用上面实例中语法来为数组动态地分配内存,如下所示: char* pvalue = NULL; // 初始化为 null 指针 pvalue = new char...return 0; } 如果要为一个包含四个 Box 对象数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象,析构函数也将被调用相同次数(4次)。

46230

如何用C++进行动态内存转换

C++ 中,您可以使用特殊运算符为给定类型变量在运行时分配堆内内存,这会返回所分配空间地址。这种运算符即 new 运算符。...如果您不再需要动态分配内存空间,可以使用 delete 运算符,删除之前由 new 运算符分配内存。 ​​...我们可以按照下面的语句使用 new 运算符来完成这点: double* pvalue = NULL; // 初始化为 null 指针 pvalue = new double; // 为变量请求内存...20 个字符字符串)分配内存,我们可以使用上面实例中语法来为数组动态地分配内存,如下所示: char* pvalue = NULL; // 初始化为 null 指针 pvalue = new...return 0; } 如果要为一个包含四个 Box 对象数组分配内存,构造函数将被调用 4 次,同样地,当删除这些对象,析构函数也将被调用相同次数(4次)。

55730

开心档之C++ 引用

C++ 引用 引用变量是一个别名,也就是说,它是某个已存在变量另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。...C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要不同: 不存在空引用。引用必须连接到一块合法内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。...指针可以在任何时候指向到另一个对象。 引用必须在创建初始化。指针可以在任何时间被初始化。...因此,第一个声明可以读作 "r 是一个初始化为 i 整型引用",第二个声明可以读作 "s 是一个初始化为 d double 型引用"。...把引用作为返回值 可以从 C++ 函数中返回引用,就像返回其他数据类型一样。

25720

软件开发入门教程网之C++ 引用

引用变量是一个别名,也就是说,它是某个已存在变量另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 ​​...C++ 引用 vs 指针​​ 引用很容易与指针混淆,它们之间有三个主要不同: 不存在空引用。引用必须连接到一块合法内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。...指针可以在任何时候指向到另一个对象。 引用必须在创建初始化。指针可以在任何时间被初始化。 ​​...因此,第一个声明可以读作 "r 是一个初始化为 i 整型引用",第二个声明可以读作 "s 是一个初始化为 d double 型引用"。...把引用作为返回值​​ 可以从 C++ 函数中返回引用,就像返回其他数据类型一样。

25330

软件开发入门教程网之C++ 引用

引用变量是一个别名,也就是说,它是某个已存在变量另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 ​​...C++ 引用 vs 指针​​ 引用很容易与指针混淆,它们之间有三个主要不同: 不存在空引用。引用必须连接到一块合法内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。...指针可以在任何时候指向到另一个对象。 引用必须在创建初始化。指针可以在任何时间被初始化。 ​​...因此,第一个声明可以读作 "r 是一个初始化为 i 整型引用",第二个声明可以读作 "s 是一个初始化为 d double 型引用"。...把引用作为返回值​​ 可以从 C++ 函数中返回引用,就像返回其他数据类型一样。

14910

软件开发入门教程网之C++ 引用

引用变量是一个别名,也就是说,它是某个已存在变量另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。​​...C++ 引用 vs 指针​​引用很容易与指针混淆,它们之间有三个主要不同:不存在空引用。引用必须连接到一块合法内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。...指针可以在任何时候指向到另一个对象。引用必须在创建初始化。指针可以在任何时间被初始化。​​...因此,第一个声明可以读作 "r 是一个初始化为 i 整型引用",第二个声明可以读作 "s 是一个初始化为 d double 型引用"。...把引用作为返回值​​可以从 C++ 函数中返回引用,就像返回其他数据类型一样。

34020

C++面试知识总结

C++程序内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储在静态存储区;另外堆中存放new/delete申请释放资源,而malloc和free申请资源存放在自由存储区...malloc/free用来申请内存和释放内存,但是申请和释放对象只能是内部数据类型。 malloc与free是C++/C语言标准库函数,new/delete是C++运算符。...delete与new配套,delete []与new []配套,用new分配内存用delete删除new[]分配内存用delete[]删除。...引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象引用。 指针在任何时候都可以改变为指向另一个对象。 引用创建和销毁并不会调用类拷贝构造函数。...2.14 野指针,未初始化指针和空指针区别 野指针:指向一个已删除对象或无意义地址指针。 原因:指针变量没有被初始化,或者指针p被free或者delete之后,没有置为NULL。

1.7K41

动态内存与智能指针

而c++11中新增智能指针能在一定程度上解决这些问题 动态内存与智能指针 在c++中动态内存管理是通过一对运算符来完成: new和delete ,new对象分配空间并返回一个指向该对象指针。...此函数在动态内存中分配一个对象初始化它,返回对象 shared_ptr。...无论何时我们拷贝一个shared_ptr,计数器都会递增。当我们给shared_ptr 赋一个新值或者shared_ptr 被销毁,他所关联计数器就会递减。...因此,我们不能将一个内置指针隐式转化为智能指针,必须使用直接初始方式 shared_ptr p1 = new int(1024); //错误,这里需要将int* 隐式转化为shared_ptr...release返回指针通常被用来初始化另一个智能指针或者给另一个智能指针赋值,如果我们不用另一个智能指针保存release返回指针,则需要手工释放指针指向资源 p2.release(); //错误

81820

基于堆栈内存详析 Java函数形参是传值还是引用?

,(因为普通基本数据类型由栈区管,long、int、short、byte、float、double、string、boolean),做形参是传值调用; 如果引用new出来实例(new String...引用必须连接到一块合法内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建初始化。指针可以在任何时间被初始化。...对于Java来说则只是一个类实例引用声明, 还没有初始化、实例化,跟别说调用构造函数了; 而Class class = new Class();只能是Java写法, 它跟C++ Class...* class = new Class();是相类似的过程, 都是在堆区开辟一块内存,初始化实例化好这块内存后,把它地址赋值给class; 也就是C++类实例可以选择性放在栈、堆中; Java类实例只能放在堆中...; 而C++使用new时候需要使用指针, Java直接用引用,没有指针;

81430

C++中五花八门初始化规则

总结 初始概念:创建变量赋予它一个值(不同于赋值概念) 类构造函数控制其对象初始化过程,无论何时只要类对象被创建就会执行构造函数 如果对象未被用户指定初始值,那么这些变量会被执行默认初始化...,默认值取决于变量类型和定义变量位置 无论何时只要类对象被创建就会执行构造函数,通过显式调用构造函数进行初始化被称为显式初始化,否则叫做隐式初始化 使用等号(=)初始化一个类变量执行是拷贝初始化,...编译器会把等号右侧初始值拷贝到新创建对象中去,不使用等号则执行是直接初始化 传统C++中列表初始化仅能用于普通数组和POD类型,C++11新标准将列表初始化应用于所有对象初始化(但是内置类型习惯于用等号初始化...定义于任何函数体之外变量会被初始化为0,定义在函数体内部内置类型变量将不被初始化(uninitialized),一个未被初始内置类型变量未定义,如果试图拷贝或以其他形式访问此类值将引发错误...概念 无论何时只要类对象被创建就会执行构造函数,通过显式调用构造函数进行初始化被称为显式初始化,否则叫做隐式初始化。

2.4K10

c++面试选择题_C语言经典笔试题

因此C++语言需要一个能完成动态内存分配和初始化工作运算符new,以及一个能完成清理与释放内存工作运算符delete。注意new/delete不是库函数。...简单来说,用new分配内存用delete删除;用new[]分配内存用delete[]删除。delete[]会调用数组元素析构函数。内部数据类型没有析构函数,所以问题不大。...答案:当类中含有const、reference 成员变量;基类构造函数都需要初始化表。 15. C++是不是类型安全? 答案:不是。...注意当数组作为函数参数进行传递,该数组自动退化为同类型指针。...1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指对象。 3) 不存在指向空值引用,但是存在指向空值指针。引用不需要判空。

1.1K10

C++经典面试题(最全,面中率最高)

因此C++语言需要一个能完成动态内存分配和初始化工作运算符new,以及一个能完成清理与释放内存工作运算符delete。注意new/delete不是库函数。...简单来说,用new分配内存用delete删除;用new[]分配内存用delete[]删除。delete[]会调用数组元素析构函数。内部数据类型没有析构函数,所以问题不大。...主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选方案包括:返回一个对象返回一个局部变量引用,返回一个new分配对象引用、返回一个静态对象引用。...答案:当类中含有const、reference 成员变量;基类构造函数都需要初始化表。 15. C++是不是类型安全? 答案:不是。...注意当数组作为函数参数进行传递,该数组自动退化为同类型指针。

1.1K30

C++】智能指针详解

C++中,动态内存管理是用一对运算符完成new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象指针,delete:指向一个动态独享指针,销毁对象,并释放与之关联内存...如果你将shared_ptr存放于一个容器中,而后不再需要全部元素,而只使用其中一部分,要记得用erase删除不再需要那些元素。...使用了动态生存期资源类: 程序使用动态内存原因: (1)程序不知道自己需要使用多少对象 (2)程序不知道所需对象准确类型 (3)程序需要在多个对象间共享数据 直接管理内存 C++定义了两个运算符来分配和释放动态内存...string *ps = new string;//初始化为空string int *pi = new int;//pi指向一个未初始int 我们可以直接使用直接初始化方式来初始化一个动态分配一个动态分配对象...在创建或reset一个这种unique_ptr类型对象,必须提供一个指定类型可调用对象删除器。

71430

什么是智能指针

但是智能指针还有一重更加深刻含义,就是把 value 语义转化为 reference 语义。C++ 和 Java 有一处最大区别在于语义不同。...我们首先想到指针,在 accept 内部 new 生成一个对象,然后返回指针。 但是问题更多。这个对象何时析构? 过早析构,程序发生错误;不进行析构,又造成了内存泄露。...对于特定对象,只能有一个智能指针可拥有,这样只有拥有对象智能指针构造函数会删除对象。然后让赋值操作转让所有权。...使用 shared_ptr 过程中有几点需要注意: 不要用同一个原始指针初始化多个 shared_ptr,会造成二次销毁。...如果函数使用 new 分配内存,并返还指向该内存指针,将其返回类型声明为 unique_ptr 是不错选择。

59020

More Effective C++:35个改善编程与设计有效方法

删除也一样(delete[]),若只调用基类析构,而不会正确调用派生类析构函数。...,然后重新抛出 exception,使它继续传播出去; 若在初始化表达式中except,则将new动作封装到Private函数中,并在函数中捕捉异常并释放内存,然后将该函数应用到初始化表达式中。...但是只有在抛出 exception 你才需要承受这样冲击,而 exceptions 出现应该是罕见。...任何时候只要你看到函数返回一个对象,就会产生临时对象(并于稍后销毁)。学习找出这些架构,你对幕后成本(编译器行为)洞察力将会有显著地提升。...● 总是以 delete删除 new返回内存;总是以 free 释放 malloc 返回内存。

65310
领券