![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++修炼
文章平均质量分 81
aolaf
这个作者很懒,什么都没留下…
展开
-
C++基础16---左值、右值、左值引用、右值引用、move
1 左值与右值2 引用的分类主要有三种形式的引用,左值引用、常量引用、右值引用。2.1 左值引用将变量绑定到左值的引用即为左值引用,左值引用必须初始化,不存在空引用,且不可以绑定右值。int test(){ int a = 1; int &ref = a; cout << ref << endl; //1 ref = 5; cout << a << endl; //5 a = 10; c原创 2021-04-12 18:10:26 · 177 阅读 · 1 评论 -
智能指针
1 智能指针的类别(1)auto_ptr(c++98), 弃用(2)unique_ptr、shared_ptr、weak_ptrunique_ptr:独占式指针,同一时间内,只有一个指针能指向该对象shared_ptr:共享式指针,多个指针指向同一对象,最后一个指针被销毁时,这个对象被释放。weak_ptr:辅助shared_ptr。2 shared_ptr2. 1 工作原理引用计数,每个shared_ptr的拷贝都指向相同对象。只有最后一个指向该对象的shared_ptr不需要再指向该对原创 2021-03-26 11:08:30 · 155 阅读 · 0 评论 -
C++基础16---函数模板、类模板
1 定义函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。c++中,模板分为函数模板和类模板两种。函数模板用于生成函数。类模板则是用于生成类。2 函数模板2.1 函数模板的通用写法template <typename 类型参数1, typename类型参数2, ...>返回值类型 模板名(形参表){ 函数体}其中的 typename 关键字也可以用 class 关原创 2021-01-10 11:58:34 · 230 阅读 · 0 评论 -
C++基础15---基类对象模型与派生类对象模型探索
1. 派生类对象模型1.1 派生类对象的组成部分派生类对象包含多个组成部分,包括:(1)派生类自己定义的子对象(成员变量、成员函数)。(2)派生类从基类继承得到的子对象(基类中定义的成员变量、成员函数)。1.2 基类指针与派生类指针由于子类对象中包含父类的对象,因此,子类的指针范围大于父类指针范围。所以,可以用父类指针指向子类对象,而子类指针无法指向父类对象。#include <iostream>using namespace std;class Animal{};原创 2020-12-22 11:27:15 · 518 阅读 · 0 评论 -
C++基础14---RTTI、dynamic_cast、typeid、type_info类、虚函数表
1. RTTI1.1 RTTI定义RTTI全称Run Time Type Identification, 运行时类型识别。通过运行时类型识别,程序能够使用基类的指针或者引用来检查这些指针或引用所指的对象的实际派生类型。1.2 RTTI的实现我们可以把RTTI看成系统赋予我们的一种能力,这种能力主要通过两个运算符实现。(1)dynamic_cast运算符:能够将基类的指针或者引用安全的转换为子类的指针或引用。(2)typeid运算符:返回指针或引用所指对象的实际类型.注意:要让RTTI的两个运算原创 2020-12-20 11:22:49 · 293 阅读 · 1 评论 -
C++基础13---友元函数、友元类、友元成员函数
1. 友元函数1)友元函数是个函数,只要让普通函数func声明为类A的友元函数,那么func这个函数就能访问类A的所有成员(成员变量、成员函数),无论是public,private,protected2)由于友元函数不属于类成员,所以友元函数的声明不受public、protected、private的影响#include <iostream>using namespace std;class A{public: int m_A = 5; void A_func1(原创 2020-12-19 21:08:54 · 499 阅读 · 1 评论 -
C++基础12---基类指针、虚函数、多态性、纯虚函数、虚析构
1. 基类指针在创建对象时,可以直接使用[类名] [对象名],也可以使用new关键字创建对象,即 [类名] 对象指针=new [类名]。其中前者对象创建在栈上,后者对象创建在堆上。#include <iostream>using namespace std;#include "Time.h"class Animal{};int main() { Animal an1; //对象创建在栈上 Animal *an2 = new Animal;//对象创建在堆上原创 2020-12-14 22:14:25 · 824 阅读 · 0 评论 -
C++基础11---类的继承
1. 继承时的调用顺序当创建子类对象时,先调用父类的构造函数,再调用子类的构造函数。#include <iostream>using namespace std;class Animal{public: Animal() { cout << "调用Animal()构造函数" << endl; }};class Dog: public Animal{public: Dog() {原创 2020-12-11 22:06:44 · 122 阅读 · 0 评论 -
C++基础10---拷贝构造函数
1. 拷贝构造函数1.1 拷贝构造函数的定义如果一个类的构造函数的第一个参数为所属类类型的引用。如果还有其他额外参数,且这些额外的参数都有默认值,则该构造函数就叫拷贝构造函数。函数的默认参数必须放在函数声明中,除非该函数没有声明。1.2 拷贝构造函数的作用拷贝构造函数会在一定的时机被系统自动调用。#ifndef DAY02_TIME_H#define DAY02_TIME_H//类的声明class Time{public: Time(); //默认构造函数声明 Tim原创 2020-12-01 18:00:26 · 120 阅读 · 0 评论 -
C++基础09---类内初始化,默认构造函数
1. 类内初始化原创 2020-11-26 20:09:06 · 305 阅读 · 0 评论 -
C++基础08---this,static
1. this2. static2.1 static 修饰变量(1)static修饰的变量被存储在静态存储区。(2)局部静态变量(函数中static型变量),值维持上次调用函数时的值。int func1(){ static int a = 0; //下次调用func1()时,a维持上一次的值 a++; return a;}int main() { cout << func1() << endl; // 1 cout &l原创 2020-11-23 22:54:32 · 169 阅读 · 1 评论 -
C++基础07---构造函数
1.构造函数1.1 构造函数的定义在类中,有一种特殊的成员函数,其函数名与类名相同,我们在创建类的对象的时候,该成员函数会被系统自动调用。这个成员函数被称为“构造函数”。1.2 构造函数的用途用于初始化类对象的数据成员。class Time{public: int m_Hour; //成员变量 int m_Minute; int m_Second;public: Time(int hour, int minute, int second) //构造函数初始原创 2020-11-22 20:34:20 · 98 阅读 · 0 评论 -
C++基础06---类型转换
1. 隐式类型转换系统自动进行,无需开发人员介入。int main() { int m = 3.14 + 5; cout << m << endl; //8, 系统自动隐式类型转换,将8.14小数部分截断}2.显示类型转换(强制类型转换)2.1 C语言风格的强制类型转换int main() { //int k = 5 % 3.2; //错误,%两侧须为整型 int k = 5 % (int)3.8; //2 int k2 =原创 2020-11-22 12:22:08 · 96 阅读 · 0 评论 -
C++基础05---迭代器
1. 迭代器简介迭代器是一种遍历容器内元素的数据类型。这种数据类型类似指针,可以理解为迭代器用来指向容器中的某个元素。2. 迭代器的定义int main() { vector<int> v1{1, 2, 3, 4, 5}; //将vector<int>::iterator理解成一个类型,利用这种类型定义的变量iter即为迭代器 vector<int>::iterator iter;}3.迭代器的使用3.1 begin()/end()操原创 2020-11-21 14:47:01 · 103 阅读 · 0 评论 -
C++基础04---vector类型
1.1 vector简介vector可以把若干对象装进来,也被称为容器。1.1 容器中常见存放的类型#include <iostream>using namespace std;#include <vector>class Student{};int main() { vector<int> v1; //存放int类型对象的容器 vector<Student> v2; //存放自定义类型 vector<ve原创 2020-11-21 00:12:33 · 216 阅读 · 0 评论 -
C++基础03---string类型
1.1 string类型简介string类型为C++标准库中的类型,代表一个可变长字符串。1.2 string类型的用法1.2.1 定义和初始化string类型对象int main() { string s1; //默认初始化,此时s1="",即空串 string s2 = "I love China!"; //把字符串I love China!拷贝到s2的一段内存中,不包含末尾的\0 string s3("I love China!"); string s4 =原创 2020-11-20 17:03:49 · 193 阅读 · 0 评论 -
C++基础02---函数的特性、内联函数、const、mutable
1. 函数的参数与返回值1.1 函数的参数(1) 函数声明时,可以只有形参类型,没有形参名。(2)函數定义中,如果形参名用不到,可以不给形参名,只给其类型。void func(int, int); //函数声明void func(int a, int) //函数定义{ a = 13; return;}1.2 函数的返回值(1)前置返回类型:函数的返回类型在函数之前(2)后置返回类型:函数的返回类型在函数之后auto func(int, int) -> voi原创 2020-11-19 23:13:26 · 128 阅读 · 0 评论 -
C++基础01---动态内存分配
1.C++中内存分配情况1.1 c++中,我们把内存分为5个区域:(1)栈: 用于存放函数的局部变量,由编译器自动分配和释放(2)堆: 程序员利用malloc/new分配,用free/delete释放(3)全局/静态存储区: 用于存放全局变量和静态变量(static),程序结束时,系统自动释放(4)常量存储区: 如"i love China"(5)程序代码区1.2 堆和栈的区别(1) 栈: 空间有限,系统自动分配,速度快,程序员控制不了(2) 堆: 只要不超过实际拥有的物理内存都可以分配,原创 2020-11-19 00:18:07 · 248 阅读 · 0 评论 -
C++对象模型探索---第2章对象---构造函数
1.默认构造函数没有参数的构造函数2.合成的默认构造函数如果我们没有定义任何构造函数, 只有在必要的时候 ,编译器才会为我们自动定义一个默认构造函数,我们称该函数为" 合成的默认构造函数".3.编译器在哪些必要情况下帮我们合成默认构造函数?case1. 该类没有任何构造函数,但其包含一个类类型的成员变量,而该成员变量所属的类有一个默认构造函数.如下代码中, B类没有任何构造函数,但其包含A类类型的成员变量a,且A类有一个默认构造函数,这时编译器会为B类自动合成一个默认构造函数,生成目的是为了调用原创 2020-11-17 18:11:46 · 72 阅读 · 0 评论 -
C++对象模型探索---第2章对象---this指针
1. this指针的调整#include <iostream>using namespace std;class A{public: int a; A() { //打印构造函数中this指针的地址 printf("A::A()的this指针是: %p\n", this); } void funcA() { //打印成员函数中this指针的地址 printf("A::func原创 2020-11-17 16:48:27 · 191 阅读 · 0 评论 -
C++对象模型探索---第2章对象---类对象所占用的空间
1. 类对象所占用的空间大小case1:空类中,类对象占用一个字节#include <iostream>using namespace std;class Person{public:};int main(){ Person p1; int size = sizeof(p1); //sizeof(p1) = 1, 空类对象p1存在首地址,占用一个字节 cout << size << endl;}case2: 类中的原创 2020-11-16 21:43:03 · 131 阅读 · 0 评论