
C++学习笔记
文章平均质量分 57
_Jxyz
这个作者很懒,什么都没留下…
展开
-
memcpy 、 strncpy、memmove 总结
memcpy 、 strncpy、memmove 总结原创 2024-09-01 14:13:18 · 784 阅读 · 0 评论 -
C++ STL 顺序容器的使用笔记
forward_list 没有rbegin()、rend()、crbegin()、rend()before_begin() 和cbefore_begin() 是forward_list独有的插入往头插入往尾部插入vector 不能往头插入push_back()在序列的尾部添加一个元素。push_front()在序列的头部添加一个元素。pop_back()移除容器尾部的元素。pop_front()移除容器头部的元素。emplace_front原创 2022-07-13 23:19:16 · 353 阅读 · 0 评论 -
继承的构造函数
继承的构造函数不能初始化派生类的成员,可以使用类内初始化,或则追加构造函数C++11 标准规定,继承构造函数与类的一些默认函数(默认构造、析构、拷贝构造函数等)一样,是隐式声明,如果一个继承构造函数不被相关代码使用,编译器不会为其产生真正的函数代码。这样比通过派生类构造函数“透传构造函数参数”来完成基类初始化的方式,总是需要定义派生类的各种构造函数更加节省目标代码空间。......原创 2022-07-04 20:38:47 · 1105 阅读 · 0 评论 -
C++拷贝、赋值、移动、析构、默认构造 什么时候会被默认生成delete
如果在类中,有一个没有类内初始化器的const内置类型成员,则该成员没有办法初始化(因为const内置类型变量必须由用户自己来初始化,注意:const的内置类型变量是无法默认初始化的)。因为该成员没有办法自己初始化(通过以上1的两种方式初始化),因此该类的默认构造函数定义为删除(delete)。如果在类中,有一个没有类内初始化器的const类类型成员,且其类型没有显示定义默认构造函数(导致该const类类型成员也没有办法默认初始化),因此该类的默认构造函数定义为删除(delete)。如果在类中,有一个没有类原创 2022-07-04 20:24:58 · 1062 阅读 · 0 评论 -
C++ 类定义的顺序和成员初始化的顺序
// 未定义标识符构造函数初始化列表 初始化顺序和位置无关,初始化顺序和成员定义顺序一样原创 2022-06-28 23:03:36 · 637 阅读 · 0 评论 -
C++友元函数声明顺序
X类中的成员函数是Y类中的友元函数引用版本也是一样错误的顺序原创 2022-06-28 22:13:58 · 587 阅读 · 0 评论 -
C++ 类的声明笔记
C++ 类的声明笔记原创 2022-06-28 21:59:10 · 512 阅读 · 0 评论 -
C++ 为什么构造函数不可以是虚函数
从内存的角度看:虚函数对应一个虚函数表,虚函数表是存储在对象的内存空间中的。而调用虚函数使用过调用虚函数表来实现的。**如果构造函数是虚函数,那么就需要通过虚函数表来调用,但是对象是通过构造函数实例化的,在调用构造函数之前,,虚函数表内存空间还没有被创建,无法找到虚表。**所以构造函数不能是虚函数从使用的角度看:虚函数是通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。,但是构造函数是通过创建对象时自动调用的,不可能通过父类的指针或者引用去调用,所以规定构造函数不能是虚函数.一个派生类的指原创 2022-06-27 21:44:43 · 691 阅读 · 0 评论 -
C++ 左值引用、右值引用和指针在汇编层面的差别
C++ 左值引用、右值引用和指针在汇编层面的差别原创 2022-06-21 23:17:04 · 259 阅读 · 0 评论 -
C++ primer学习笔记 - 第十五章 面向对象程序设计
一、OOP:概述继承(inheritance)动态绑定(dynamic binding)静态绑定二、定义基类和派生类定义基类定义派生类类型转换和继承三、虚函数四、抽象基类五、访问控制与继承六、继承中的类作用域七、构造函数和拷贝函数虚析构函数合成拷贝控制与继承派生类的拷贝控制成员继承的构造函数...原创 2022-03-23 23:16:47 · 1075 阅读 · 0 评论 -
C++ primer 学习笔记- 16章(类模板)
1. 类模板1.1 实例化类模板1.2 类模板的成员函数1.3 类模板和友元1.4 类模板的static成员1.5 使用类的类型成员1.6 默认模板实参1.7 成员模板1.7.1 普通类的成员模板1.7.2 类模板的成员模板原创 2022-03-22 21:43:37 · 869 阅读 · 0 评论 -
C++ primer 学习笔记- 16章(函数模板)
1. 函数模板函数模板是一种特殊的函数,可以使用不同的类型进行调用,对于功能相同的函数,不需要重复编写代码,并且函数模板与普通函数看起来很类似,区别就是类型可以被参数化存在inline 和 constexpr 函数模板1.1 实例化函数模板template <typename T> void func(T t){ cout<<t<<endl;}1.1.1 隐式实例化: func(i)在发生函数模板的调用时,不显示给出模板参数而经过参数原创 2022-03-21 22:10:35 · 849 阅读 · 0 评论 -
C++primer 学习笔记 -第16章 模板与泛型编程(模板)
1. 模板模板是一种对类型进行参数化的工具;通常有两种形式:函数模板和类模板;1.1 模板类型参数模板参数通常表示类型,表示类型的模板参数称为类型模板参数(type template parameter)template<typename T,typename Container>class Grid{…}1.2 非模板类型参数整数及枚举类型指针(对象指针或函数指针)引用(对象引用或函数引用)指向类对象成员函数的指针templatetemplate<vo原创 2022-03-20 23:09:55 · 228 阅读 · 0 评论 -
C++primer 学习笔记 -第16章 模板与泛型编程(模板的偏特化与全特化)
1. 特化的概念模板特化(template specialization)不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。1.1 模板偏特化模板偏特化(Template Partitial Specialization)是模板特化的一种特殊情况,指显示指定部分模板参数而非全部模板参数,或者指定模板参数的部分特性分而非全部特性,也称为模板部分特化。与模板偏特化相对的是模板全特化,指对所有模板参数进行特化。模板全特化原创 2022-03-20 21:28:51 · 907 阅读 · 0 评论 -
C++primer 学习笔记 -alloctor
引言new有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起。类似的,delete将对象析构和内存释放组合在了一起。我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起。因为在这种情况下,我们几乎肯定知道对象应有什么值。当分配一大块内存时,我们通常计划在这块内存上按需构造对象。在此情况下,我们希望将内存分配和对象构造分离。这意味着我们可以分配大块内存,但只在真正需要时才真正执行对象的创建操作**(同时付出一定开销)。一般情况下,将内存分配和对象构造组合在一起可能会导致不必要原创 2022-03-18 22:29:59 · 111 阅读 · 0 评论 -
C++primer 学习笔记 -智能指针和动态数组
原创 2022-03-18 21:53:22 · 491 阅读 · 0 评论 -
C++ primer 学习笔记-智能指针自定义删除器
默认情况下,智能指针使用delete释放其管理的资源,有时候,可能要修改默认使用delete释放资源的行为。本文将列出我所知道的所有自定义删除器的方法。shared_ptr使用删除器格式unique_ptr 使用删除器格式例子:Connection是一个管理连接类,在释放Connection之前,我们需要调用close函数来关闭连接。观察如下代码:class Connection {public: Connection() = default; explicit Connec原创 2022-03-18 20:45:06 · 1400 阅读 · 0 评论 -
C++primer学习笔记-成员访问运算符
成员访问运算符首先介绍下点运算符,用于获取类对象的一个成员。点运算符与箭头运算符之间的关系:*ptr->mem 与 (ptr).mem 等价。因为点运算符的优先级别比*运算符的优先级高,所以必须加括号....原创 2022-03-09 23:49:54 · 345 阅读 · 0 评论 -
C++primer学习笔记-递增表达式和递减表达式
递增表达式和递减表达式前置版本的递增运算符避免了不必要的工作,它把值加1后直接返回改变了的运算对象.后置版本需要将元素值存储下来以便返回这个未修改的内容,如果不需要修改前的值,那么后置版本的操作就是一种浪费。...原创 2022-03-09 23:47:19 · 336 阅读 · 0 评论 -
C++primer学习笔记-求值顺序
求值顺序大多数情况下不会指定求值顺序对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改同一个对象,将会引发错误并产生未定义行为// << 运算符没有明确规定何时对运算对象求值int i = 0;cout<< i << " "<< ++i <<endl; // 未定义的 因为上诉程序是未定义的原因**,编译器可能先求++i的值再求i的值**,或则先求i的值然后再求++i的值,甚至编译器还可能做出完全不同的操作.因此表达式的行为不原创 2022-03-09 23:28:16 · 708 阅读 · 0 评论 -
C++ primer学习笔记第三章 - 字符串
string初始化string s1; // 默认初始化string s2 = s1;// 拷贝初始化string s3(s1); // 直接初始化,string s2 = s1 等价string s4(“hello string”);//直接初始化,s4 是字面值常量的副本string s5 = “hello string”;//拷贝初始化, string s4(“hello string”) 等价string s6(10, ‘c’); //初始化由连续10个字符c组成的串操作s原创 2022-03-09 23:09:08 · 184 阅读 · 0 评论 -
C++ primer学习笔记第三章变字符串、向量和数组-namespace
namespacenamespace是名字空间,可以防止多个文件有重复定义成员(变量,函数,类等)命名空间成员的外部定义的格式为:命名空间名::成员名 ……有名字的命名空间嵌套namespacenamespace Outer // 命名空间Outer的定义{ int i; // 命名空间Outer的成员i的内部定义 namespace Inner // 子命名空间Inner的内部定义 { void f() { i++; } // 命名空间Inner的原创 2022-03-07 21:40:25 · 375 阅读 · 0 评论 -
C++ primer学习笔记第三章变字符串、向量和数组-using
usingusing 声明using 声明 (using declaration) 是将命名空间中单个名字注入到当前作用域的机制,使得在当前作用域下访问另一个作用域下的成员时无需使用限定符 ::using 声明将其它 namespace 的成员引入本命名空间的 当前作用域 (包括其嵌套作用域) 。一个 using 声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都非常准确。#include <iostream>class Base {protected:原创 2022-03-07 21:38:16 · 349 阅读 · 0 评论 -
C++ primer学习笔记第2章变量和基本类型-decltype
decltype(类型说明符)随着程序越来越复杂,程序中用到的类型也越来越多,这种复杂性体现在两个方面。问题一: 一些类型难于“拼写”,它们的名字既难记又容易写错,还无法明确体现其真实目的和含义。解决问题一: 可以使用类型别名技术。问题二: 有时候根本搞不清到底需要的类型是什么,程序员不得不回过头去从程序的上下文寻求帮助。解决上面两个问题可以是:解决问题二: 可以使用auto和本文的主题:decltype。用法decltype + 变量 vardecltype + 表达式 expr原创 2022-03-06 22:29:56 · 342 阅读 · 0 评论 -
C++ primer学习笔记第2章变量和基本类型-auto
autoauto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。时刻要注意auto并不是一个真正的类型。auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。auto和其他变量类型有明显的区别:auto声明的变量必须要初始化,否则编译器不能判断变量的类型。auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数auto的用法用于代替冗长复杂、变量使用范围专一的变量声明原创 2022-03-06 21:20:42 · 241 阅读 · 0 评论 -
C++ primer学习笔记第2章变量和基本类型-const限定符
const顶层const底层constconst 和 函数const 和 指针const 和 对象原创 2022-03-05 11:48:33 · 418 阅读 · 0 评论 -
C++ primer学习笔记第2章变量和基本类型-constexpr
constexpr在编译过程就能得到计算结果的表达式constexpr表达式是指值不会改变并且**在编译过程就能得到计算结果的表达式**。声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:指针和constexpr在constexpr声明中如果定义了一个指针,限定符conxtexpr仅对指针有效,与指针所指的对象无关。 constexpr int* p = nullptr; // p是一个指向整数的常量指针 const int* q = nullptr; // /原创 2022-03-04 23:32:47 · 393 阅读 · 0 评论 -
C++ primer学习笔记-默认初始化
默认初始化内置类型的变量如果初始化,则它的默认初始化值取决于定义它的位置定义在任何函数之外的未初始化的内置类型变量(也就是全局变量)会被默认初始化为0定义在函数体内部的(包括main函数)未初始化的内置类型变量(也就是局部变量)的默认初始值是未定义的(也就是一个随机数).如果试图拷贝或以其他方式访问该变量的值,此时会引发编译错误未初始化的内置类型的全局变量的默认初始化值还取决于变量的数据类型数值数据类型 (0)bool (false)char (‘\0’)string("")静态变原创 2022-02-24 23:15:43 · 729 阅读 · 0 评论 -
C++ primer学习笔记-13章-移动构造函数和移动赋值重载函数
移动构造函数移动构造函数为什么需要加noexcept必须在类头文件的声明中和定义中(如果定义在类外的话)都指定noexceptnoexcept关键字修饰的函数不会在执行过程中抛出异常。如果标记为noexcept的函数抛出异常,那么编译器会调用std::terminate()函数中断程序执行。1.void func() noexcept;2.为noexcept额外提供一个常量表达式作为其参数,true函数被标记为不抛出异常constexpr bool suppressExcept = true原创 2022-02-24 00:42:13 · 580 阅读 · 0 评论 -
C++ primer学习笔记-13章-移动迭代器&引用限定符
移动迭代器创建移动迭代器//创建一个 vector 容器std::vector<std::string> myvec{ "one","two","three" };//将 vector 容器的随机访问迭代器作为新建移动迭代器底层使用的基础迭代器typedef std::vector<std::string>::iterator Iter;//创建并初始化移动迭代器std::move_iterator<Iter>mIter(myvec.begin());s原创 2022-02-24 00:36:07 · 896 阅读 · 0 评论 -
C++ primer学习笔记-13章-对象移动
对象移动在对象拷贝后就立即被销毁的情况下,移动而非拷贝对象会大幅度提升性能。以及像 IO 类或 unique_ptr 这样的类,包含不能被共享的资源,不能拷贝但可以移动。而标准库容器、string 和 shared_ptr 类既支持移动也支持拷贝左值引用 & 右值引用定义右值引用:(T &&)左值引用:T&区别左值持久,右值短暂左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时对象变量是左值由于右值引用只能绑定到临时对象,我原创 2022-02-23 23:25:37 · 177 阅读 · 0 评论 -
error LNK2001: 无法解析的外部符号
C++中静态成员变量要在类外部再定义或初始化class StrVec{public: StrVec() =default; StrVec(const StrVec& strVec); // 赋值构造函数 StrVec& operator=(const StrVec&);// 拷贝构造函数 ~StrVec(); // 析构函数 void puch_back(const std::string&);// 拷贝元素 size_t size() { return原创 2022-02-22 22:34:25 · 1384 阅读 · 0 评论 -
C++ primer学习笔记-13章-拷贝控制
拷贝控制和资源管理通常,管理类外资源的类必须定义拷贝控制成员。这种类需要通过析构函数来释放对象所分配的资源。为了定义这些成员,首先得确定此类型对象的拷贝语义,一般有两种选择:定义拷贝操作,使类的行为像一个值,如string类。当我们拷贝一个像值的对象时,副本和原对象是独立的。改变副本不会对原对象有任何影响,反之亦然。定义拷贝操作,使类的行为像一个指针,如shared_ptr类。行为像指针的类则共享状态。当我们拷贝一个这种类的对象时,副本和原对象使用相同的底层数据。改变副本也会改变对象,反之亦然原创 2022-02-16 00:14:26 · 414 阅读 · 0 评论 -
C++Primer 13章学习笔-default和delete
default就是指示编译器生成一个合成版本的构造/析构函数(包括拷贝构造,赋值构造,移动构造,移动赋值构造)。class A{public: A() = default; A(const A& a) = default; A& operator=(A&); ~A() = default;}我们只能对具有合成版本的成员函数使用=default;比如你已经定义了一个有参的构造函数,那么默认构造函数编译器就不再生成了,你可以通过defau原创 2022-02-14 23:47:27 · 364 阅读 · 0 评论 -
C++Primer 13章学习笔-三/五法则
三/五法则什么是三法则如果需要析构函数,则一定需要拷贝构造函数和拷贝赋值操作符。什么是五法则在较新的 C++11 标准中,为了支持移动语义,又增加了移动构造函数和移动赋值运算符,这样共有五个特殊的成员函数,所以又称为“C++五法则”;如果需要析构函数,则一定需要拷贝构造函数和拷贝赋值操作符。原因:类中出现了指针类型的成员。有指针类型的成员,我们必须防止浅拷贝问题,所以,一定需要拷贝构造函数和赋值操作符,这两个函数是防止浅拷贝问题所必须的。一个对象拥有额外的资源(指针指向的内存),原创 2022-02-14 00:19:25 · 480 阅读 · 0 评论 -
C++ 学习笔记临时对象
临时对象格式:类名();作用域只有这一条语句,相当于只执行了一个构造函数和一个析构函数除了临时对象,也有临时变量,例如语句int(12);就是一个临时变量,当这句语句执行完了,变量也就释放了,对外部没有任何影响,我们可以通过一个变量来接受这一个临时的变量,例如:int a=int(12);这与int a=12;不同,后者是直接将一个整型数值赋给变量a,而前者是先创建一个临时的变量,然后再将这个变量赋给变量a...原创 2022-02-13 00:16:27 · 251 阅读 · 0 评论 -
C++primer 学习笔记13章拷贝赋值运算符
拷贝赋值运算符一个名为 operator= 的函数(operator后加表示要定义的运算符的符号),重载运算符,有返回类型和参数,返回类型通常是左侧运算符的引用若在类内未显式定义,则编译器会自动生成合成拷贝赋值运算符,它主要是将运算符右侧的所有非static成员赋给左侧元算对象对应成员(或是用来禁止该类型对象的赋值)delete来指定不生成拷贝赋值运算符(对象就不能通过值传递)class Sales_data{public: Sales_data(const Sales_data&原创 2022-02-12 23:41:54 · 245 阅读 · 0 评论 -
C++primer 学习笔记13章析构函数
析构函数波浪号加类名构成,没有返回值,也不接受参数(由于不接受参数,因此它不能被重载)作用构造函数初始化对象的非static数据成员,析构函数释放对象所使用资源,并销毁对象的非static数据成员执行顺序构造函数中,成员初始化是在函数体执行之前完成的,且按照他们在类内出现的顺序进行初始化,析构函数中,首先执行函数体,然后销毁成员,成员按照初始化顺序的逆序销毁,所以析构函数可以执行设计者想要的任何收尾工作,再销毁成员成员的销毁完全依赖于其本身的类型成员的销毁完全依赖于其本身的类型,类类型需要执原创 2022-02-12 23:41:12 · 650 阅读 · 0 评论 -
C++primer 学习笔记13章 拷贝构造函数
拷贝构造函数一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值。(参数可以是 const 引用,也可以是非 const 引用。 一般使用前者)拷贝构造函数在几种情况下都会被隐式地使用。因此,拷贝构造函数通常不应该是explicit的拷贝构造函数调用的情况一个对象作为函数参数,以值传递的方式传入函数体一个对象作为函数返回值,以值传递的方式从函数返回一个对象用于给另外一个对象进行初始化(常称为赋值初始化)等号右侧对象拷贝到正在创建的对象中,如果需要还需进行类型转换(拷贝初始化原创 2022-02-12 23:40:59 · 474 阅读 · 0 评论 -
C++ primer 学习笔记 IO(三)
string 流ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含这个头文件。istringstream类用于执行C++风格的串流的输入操作。ostringstream类用于执行C风格的串流的输出操作。strstream类同时可以支持C风格的串流的输入输出操作。stringstream的特有操作strm::str()返回的是临时对象,不能对其直接操作。istringstreamistringstream对象可以绑定一行原创 2022-01-20 00:02:21 · 299 阅读 · 0 评论