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

【C++】C++ this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

, 这个增加参数是 对象本身指针 ; Student , 定义了如下函数 : // 成员函数 转为 全局函数 , 多了一个参数 Student* pThis 作为第一个参数 void..., 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 成员函数 , 通过 this 指针访问对象本身成员 ; 全局函数 , 实现两个 Student 相加 , 接收两个...; } 详细代码 , 参考最后完整代码示例 ; 二、有参构造函数设置默认参数值 ---- 为 Student 定义了有参构造函数 , 则其默认无参构造函数 , 就不会生成 ; // 带参构造函数...; 如下带参数构造函数 , 并且为其 有参构造函数 参数 设置一个默认值 , 此时就可以使用 名 对象名 方式定义对象变量 ; class Student { public: // 带参构造函数...int height; // 身高 }; 此时就可以使用默认构造函数 , 创建 Student 对象 ; 三、返回匿名对象与返回引用 ---- 在上面的章节 , 将 两个 Student 对象相加

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

【C++】 使用红黑树模拟实现STLmap与set

这些函数就可以以一种统一实现(即都用第一个模板参数接收key去查找),这样map和set才可以共同复用同一个红黑树模板。...当然它们只是共用了同一个模板而已,最后实例化出来还是不同对象,但是这不就正是模板出现主要意义嘛,实现代码复用,我们程序员来说还是方便了很多。...然后对于set,其实是不需要,但是为了匹配,因为它们用了同一个红黑树模板,所以也要写一个 然后把这个仿函数传给RBTree第三个模板参数,这样红黑树里面,我们不需要管data是单独key...不是的,大家回忆一下拷贝构造,他要求参数必须是当前类同类型对象引用 而大家看这里: Self才是当前类型别名,而第三个构造函数参数是iterator,跟Self是不一样,如果它用Self...所以,这里第三个构造函数参数写成iterator情况下: 如果当前__rb_tree_iterator这个迭代器模板被实例化成iterator的话那它就是一个拷贝构造了,因为这是这个参数就跟对象类型匹配了

13310

STL之容器适配器(stack,queue和priority_queue)

priority_queue:是一个封装了 vector 容器适配器模板,默认实现是一个元素排序,保证最大元素总在队列最前面的队列。...size():返回栈中元素个数。 empty():没有元素情况下返回 true。 emplace():用传入参数调用构造函数栈顶生成对象。...如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义。 push(const T& obj): queue 尾部添加一个元素副本。...empty():如果 queue 没有元素的话,返回 true。 emplace():用传给 emplace() 参数调用 T 构造函数 queue 尾部生成对象。...:通过调用传入参数构造函数序列适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。 top():返回优先级队列第一个元素引用。 pop():移除第一个元素。

37330

3.Writing Larger Programs

指针: 在用于按引用传递函数中使用时,必须取消指针引用才能访问基础对象。 引用通常比指针更简单和安全。作为一个很好经验法则,可能情况下,应该使用引用来代替指针。...添加一个构造函数 解决这个问题最好方法是向Car添加构造函数构造函数允许您使用所需数据实例化新对象。在下一个代码单元,我们为Car添加了一个构造函数,它允许传入数字和颜色。...例如,PrintCarData方法定义可以看到: void Car::PrintCarData() 如果有两个方法具有相同名称,这可以防止任何编译器问题。 改变了构造函数初始化变量方式。...) : color(c), number(n) {} 成员构造函数主体(现在是空)之前初始化。...初始化器列表是构造函数初始化许多类属性快速方法。此外,编译器处理列表初始化属性与构造函数初始化属性略有不同。如果类属性是引用,则必须使用初始值设定项列表其进行初始化。

42920

【C++】构造函数分类 ② ( 不同内存创建实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同内存创建实例对象 1、栈内存创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...) , 介绍了 三种类型 构造函数 , 并在 main 函数 分别 调用了这 3 种构造函数 ; 下面的调用方式 , 调用一个构造函数 , 创建 Student 实例对象 , 最终将实例对象赋值给了...栈内存 变量 Student s1 ; 这些都是 栈内存 创建 实例对象 情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存实例对象销毁 ; 栈内存 调用 构造函数 创建 实例对象 , 不需要关注其内存占用 ; 2、堆内存创建实例对象 栈内存 声明 实例对象 方式是 : 该 s1...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass , 该类定义了一个有参构造函数

14820

读完某C++神作,我只记下了100句话

定义函数体外内置变量自动初始化成0,定义函数体内内置变量不进行自动初始化,类型(string)调用默认构造函数初始化。...const对象,指针引用只能调用常量成员函数。 没有前缀成员都被假定为this调用。 默认构造函数按变量初始化规则初始化中所有成员【内置类型作为局部变量时不初始化】。...泛型代码两个原则:1.模板形参是const引用 2.函数只用<比较 模板形参数量自由,可以设定返回值为一个形参。...非类型形参模板实参:template 实例化时必须是常量表达式 Screen 模板友元表示任何实例可以访问任何实例。模板可以有模板成员。...模板特化:template 模板函数形参表 函数体 特化 也可以只特化某个成员 部分特化:多个模板形参,特化某个形参【编译器会优先选择特化】。

1.4K20

两万字总结《C++ Primer》要点

尾部插入/删除速度快。 9.2 容器库概述 一般,每个容器都定义一个头文件。 容器均定义为模板。...若c为空,函数行为未定义 c.front() 返回c首元素引用。若c为空,哈数行为未定义 c[n] 返回c中下标为n元素引用,n是一个无符号整数。...pi = new int(1024); // pi指向对象值为1024 // 动态分配对象进行值初始化,只需类型名之后加上一空括号 int *pi1 = new int; // 默认值初始化...使用未构造内存,其行为是未定义。 a.destroy(p) p为T*类型指针,此算法p指向对象执行析构函数 术语 new : 从自由空间分配内存。new T 分配并构造一个类型为T指针。...模板定义以关键词template开始,后面跟尖括号,其内为一个用逗号分隔一个或多个模板参数列表,随后是定义。 函数模板模板定义,可从它实例化出特定函数

1.5K30

两万字总结《C++ Primer》要点

尾部插入/删除速度快。 9.2 容器库概述 一般,每个容器都定义一个头文件。 容器均定义为模板。...若c为空,函数行为未定义 c.front() 返回c首元素引用。若c为空,哈数行为未定义 c[n] 返回c中下标为n元素引用,n是一个无符号整数。...pi = new int(1024); // pi指向对象值为1024 // 动态分配对象进行值初始化,只需类型名之后加上一空括号 int *pi1 = new int; // 默认值初始化...使用未构造内存,其行为是未定义。 a.destroy(p) p为T*类型指针,此算法p指向对象执行析构函数 术语 new : 从自由空间分配内存。new T 分配并构造一个类型为T指针。...模板定义以关键词template开始,后面跟尖括号,其内为一个用逗号分隔一个或多个模板参数列表,随后是定义。 函数模板模板定义,可从它实例化出特定函数

1.6K20

C++(STL3)容器适配器(1) stack,queue and priority_queue

如你所见,使用拷贝构造函数时,既可以用初始化列表,也可以用圆括号。 2.堆栈操作相关函数: 和其他序列容器相比,stack 是一存储机制简单、所提供操作较少容器。...size():返回栈中元素个数。 empty():没有元素情况下返回 true。 emplace():用传入参数调用构造函数栈顶生成对象。...如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义。 push(const T& obj): queue 尾部添加一个元素副本。...empty():如果 queue 没有元素的话,返回 true。 emplace():用传给 emplace() 参数调用 T 构造函数 queue 尾部生成对象。...:通过调用传入参数构造函数序列适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。 top():返回优先级队列第一个元素引用。 pop():移除第一个元素。

64330

第 12 章 动态内存

int *pi = new int; // pi是一个指向动态分配、未初始化无名对象      默认情况下,动态分配对象是默认初始化,这意味着内置类型或组合类型对象值将是未定义,而类型对象将用默认构造函数进行初始化...对于一个定义了默认构造函数类型,其 const动态对象可以隐式初始化,而其他类型对象就必须显式初始化。...shared_ptr shared_ptr p(new int(42)); // 引用计数为 1 process(p); // 值拷贝 p会递增它引用计数; process引用计数值为...对于 shared_ptr模板,删除器是模板 function数据成员,可以通过拷贝构造函数或 reset函数进行更改。...而对于大块内存分配时,将内存分配和对象构造组合在一起,可能会造成不必要浪费(多次赋值,一次默认初始化时,一次使用时)。更重要是,如果一个没有默认构造函数,就无法为其分配动态数组!

1.4K40

《Effective Modren C++》 进阶学习(上)

类型推导如下进行: 如果expr是左值,T和ParamType都会被推导为左值引用。 第一,这是模板类型推导唯一一种T和ParamType都被推导为引用情况。...)(int, double) f2(someFunc); //param被推导为指向函数引用,类型为void(&)(int, bouel) 「小结」 模板类型推导时,有引用实参会被视为无引用,他们引用会被忽略...优先考虑使用deleted函数而非使用未定义私有声明 阻止某些特定成员函数被外部调用时,有两种常见方法:使用 private 访问修饰符将其声明为私有,或者使用 delete 关键字将其声明为已删除...C++11实现一个空,编译器会自动声明六个函数:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符。  ...理解特殊成员函数生成 C++术语,特殊成员函数是指自己生成函数。C++98有四个:默认构造函数、析构函数、拷贝构造函数和拷贝赋值函数

16320

【c++】和对象(六)深入了解隐式类型转换

,这个只是一个声明,定义是对象实例化时候完成,有些成员,必须在定义时候进行初始化 初始化列表每个元素都直接对应一个成员变量或基,允许构造函数体执行之前这些成员或基进行初始化。...初始化列表提供了一种高效、直接初始化成员变量和基方式,而构造函数则完成剩余初始化逻辑和设置,比如动态开辟一个数组进行赋值时候,就用到函数体 成员变量声明次序就是其初始化列表初始化顺序...实际执行时,未定义值可能是内存该位置任何值,这取决于编译器和运行时环境。 要修正这个问题,应该按照成员变量声明顺序初始化它们,或者更改成员变量声明顺序以反映期望初始化顺序。...C++,如果一个构造函数只需要一个参数(或所有参数除了第一个外都有默认值),那么这个构造函数允许从构造函数参数类型到类型隐式转换。...这种转换使得单个值可以被视为是该类一个实例,即使没有显式地调用构造函数 C cc1(1); 这行代码直接调用了C构造函数,使用1作为参数创建了cc1象。

5610

【笔记】《C++Primer》—— 第12章:动态内存

这一章介绍了标准库动态内存管理方面,其中12.1几个智能指针是C11引入非常实用。这章优化C++代码编写有很大意义,值得好好理解。...,标准库头文件memory定义了两个智能指针:允许多个指针指向同个对象shared_ptr,指针独占对象unique_ptr,还有一个伴随引用指针weak_ptr。...和容器类似,智能指针也是模板 12.1.1-12.1.4 shared_ptr 通常讲到C++智能指针就是指shared_ptr,其操作如下 ?...,但是我们必须类似指定关联容器比较器一样模板尖括号中指出删除器类型 // 需要指明删除器类型 unique_ptr p(new int...allocator分配内存是未构造,因此我们需要用construct函数构造其中元素,用destroy来析构元素 当需要批量构造元素到这段内存时,我们可以使用uninitialized系列算法来填充

46510

C++复习篇

25.泛型函数模板(兼容不同类型) 26.泛型模板(兼容不同类型) 27.数值型函数模板和数值型模板(兼容不同数值) 28.C++智能指针 29.Qt智能指针 1.const const和define...10 *p=3   {   } }; 11.析构函数 注意: 里,当定义了析构函数,编译器就不会提供默认构造函数了,所以还要自己定义一个构造函数。...使用new创建对象变量,不使用时,需要使用delete,才能调用析构函数 构造函数调用顺序 1. 首先判断父是否存在,若存在则调用父构造函数 2....最后调用对象本身构造函数 12.const成员函数 cosnt成员函数里只能调用const成员函数 const成员函数不能直接修改成员变量值 只有mutable成员变量或者顶层const成员是可以修改...答: 其实编译器函数模板进行了两次编译 第一次编译时,首先去检查函数模板本身有没有语法错误 第二次编译时,会去找调用函数模板代码,然后通过代码真正参数,来生成真正函数

1.3K20

【笔记】《Effective C++》条款1-25

, 是先构造, 然后逐级向上构造, 底层构造完成前, 派生相关变量都是未定义....因此如果在构造函数调用了虚函数, 那么会根据当前正在构造类型来调用相应函数版本, 而非派生版本....析构函数尽管调用顺序相反但是思路一致 所以不要在析构/构造过程调用虚函数 补偿方法是将需要让派生执行函数以非虚函数形式写好, 然后将其所需变量通过构造函数构造初值列中进行传递....weak_ptr: 不参与引用计数, 与shared_ptr一起使用 14 资源中小心Copying行为 这一条是当你不得不自己建立资源管理时候要注意 如果RAII进行复制是不合理, 那么就应该禁止它...不允许是模板是因为std设计协议就是不要为std添加任何额外模板, 函数, 等等, 我们只允许添加新模板特化版本 最后我们需要调用swap时候, 先using std::swap;暴露出std

97830

连接器工具错误lnk2019_2019年十大语文错误

:::no-loc(static):::未定义成员 9.生成依赖项仅在解决方案定义为项目依赖项 10.未定义入口点 11.使用 Windows 应用程序设置生成控制台应用程序 12.尝试将64位库链接到...:::no-loc(wchar_t):::类型定义不一致 其他资源 已编译函数函数符号进行引用或调用,但是链接器在要链接任何库或对象文件中都找不到符号定义。...请确保函数调用与声明匹配,并且声明与定义匹配。 调用模板函数代码还必须拥有包括与定义相同模板参数匹配模板函数声明。 有关模板声明不匹配示例,请参阅示例部分示例 LNK2019e。...5.已声明但未定义函数或变量 当标头文件存在声明,但未实现匹配定义时,可能会出现 LNK2019。 对于成员函数或 :::no-loc(static)::: 数据成员,实现必须包括范围选择器。...:::no-loc(static):::未定义成员 :::no-loc(static):::成员必须具有唯一定义,否则它将违反单个定义规则。

4.1K20

Effective Modern C++翻译(1):序言

概念上(尽管并不总是在实践)右值相对应于从函数返回匿名临时变量,而左值相对应于你可以引用对象,既可以通过指针,也可以通过引用。...class Widget { public: Widget(Widget&& 这里,widgt移动构造函数取得rhs参数地址是完全合法,所以rhs是一个左值,尽管它类型是一个右值引用...typename,这只是个人偏爱,class在这里同样适用,仅仅在我展示一些来自C++标准代码引用时候,我会使用class声明模板参数,因为标准里就是这样做。...一个函数调用,调用端表达式是这个函数实参(argument),这些参数被用来实例化函数形参(parameters),第一个例子,实参是wid,第二个例子,实参是std::move(wid...同样,我几乎不区分函数模板(即产生函数模板)和模板函数(即从模板里实例化函数),模板模板也一样。

1.2K90

第 13 章 拷贝控制

编译器略过了拷贝构造函数 一个构造函数,成员初始化是函数体执行之前完成,且按照它们中出现顺序进行初始化。...而如果该类对象没有定义 swap函数,则会调用标准库模板函数。...使用 move代码应该使用 std::move,而不是 move,这是因为具有转换为右值引用功能函数就是标准库函数模板,而不使用 std,则可能引起潜在名字冲突。...有成员定义了自己拷贝构造函数未定义移动构造函数,或者是有成员未定义自己拷贝构造函数且编译器不能为其合成移动构造函数时,移动构造函数会被定义为删除。...,就必须所有函数都加上引用限定符,或者所有都不加。

95950
领券