c++学习
c++学习笔记和感悟
※宋健※
这个作者很懒,什么都没留下…
展开
-
c++怎么返回对象
返回对象,无非两种方式,返回栈对象和堆对象指针,栈对象指针不能返回,因为可能使用不该使用的内存,堆对象也不能直接返回,因为会产生内存泄漏。下面,我们分析两种返回方式的优缺点,及针对缺点的解决方案。返回栈对象: 优点:不用手动释放内存,避免了内存泄漏; 缺点:会产生对象拷贝,如果对象比较大,比如,对象里面有大数组,会产生性能开销。返回堆对象指针: 优点:不会产生对象拷贝,对性能友好; 缺点:函数调用之后手动释放对象,代码管理难度和内存泄漏风险提高。那有没有办...原创 2020-11-30 23:24:25 · 2339 阅读 · 0 评论 -
c++移动构造函数浅解
本博客是《C++新经典》(王健伟著)的学习笔记,本人是c++初学者,如果有理解错误或者理解不足的地方,还请大神能够指正。c++搞出了std::move把左值转成右值,还搞出移动构造函数,借此改善性能问题,个人感觉,对我这样的初学者带来一定的理解难度。我总结了一下,所谓拷贝构造函数在标准上,是深拷贝,为了改善拷贝构造函数带来的成本开销,c++搞出了移动构造函数,本质上就是浅拷贝,综上,其实就是在折腾深浅拷贝而已,其实各有利弊。1.标准的拷贝构造函数是深拷贝,有对象复制带来的成本开销;2.拷贝构原创 2020-11-15 23:48:02 · 250 阅读 · 0 评论 -
C++this加引用实现链式编程
利用c++的this指针和引用,能够实现链式编程,我们之间看代码演示。#include <iostream>#include <vector>using namespace std;class Person{public: int age; Person& AddAge(int page){ age+=page; return *this; } Person(){ cout<&原创 2020-11-15 08:40:03 · 701 阅读 · 0 评论 -
C++ Vector数据插入
用迭代器向vector插入数据时,要注意控制迭代器的位置,直接插入,程序会直接崩溃。下面用代码解释这个问题。#include <iostream>#include <vector>using namespace std;//元素值与3取余是0时插入一个数字void VectorInsert(){ vector<int> v{1,2,3,4,5,7,8,9}; auto it=v.begin(); int cnt=0; w原创 2020-11-14 13:12:26 · 2479 阅读 · 0 评论 -
C++引用和指针区分
本博客参照《More Effective C++》(Scott Meyers著,侯捷译)。引用和指针的不同一直困扰我很久,看了《More Effective C++》,系统梳理了一下引用和指针的区别。下面我们直接结合代码以及代码注释进行理解。#include <iostream>using namespace std;void printStr1(string& str){ cout<<str<<endl;}void printS原创 2020-11-13 00:00:15 · 104 阅读 · 0 评论 -
c++移动构造函数解决多线程对象复制问题
主线程启动子线程时,会复制对象,造成成本开销,鉴于子线程需要自动释放内存的问题,创建子线程时不能传递对象指针,只能按照值传递对象(形参分配在栈上,通过值传递的对象可以自动释放)。按照值传递就会产生对象复制问题,又因为不能传递指针,只能通过移动构造函数降低内存成本。直接看代码及运行 结果:#include <iostream>#include <string>#include <thread>using namespace std;class Sch原创 2020-09-02 00:05:14 · 430 阅读 · 0 评论 -
简单案例说明c++右值引用
理解此问题提前是理解临时对象的概念,如果此概念模糊,请阅读王健伟老师著作《C++新经典》14章13节,或者自己在网上查询。右值引用,简单说,就是为了解决对象复制的性能问题,实现对象内属性的浅拷贝,注意,是对象内属性,不是对象的浅拷贝。下面,我们直接看代码理解。#include <iostream>#include <string>using namespace std;class School{public: string addr; string name原创 2020-08-30 14:09:40 · 135 阅读 · 0 评论 -
c++用引用遍历数组
c++遍历可以直接用值或者引用遍历数组,我们先看代码。int main(){ int arr[5] = { 1,2,3,4,5 }; cout << "用值遍历" << endl; for (int i : arr) { cout << "arr地址:" << &arr << endl; cout << "第一次i的地址:" << &i << endl; break;原创 2020-08-29 17:54:27 · 995 阅读 · 0 评论