wumingke / cpp_base Goto Github PK
View Code? Open in Web Editor NEWc++基础
c++基础
函数的分文件编写 创建后缀名为.h的头文件 创建后缀名为.cpp的源文件 在头文件中写函数的声明 在源文件中写函数的定义 指针 定义:就是一个内存地址 作用:通过指针间接访问内存数据 指针变量:保存指针地址的变量 int a = 10; // 假设 10 存储在 0x0000 0x0000 是一个指针地址 int * p ; // 定义指针 p = &a; // 取地址,等于0x0000 那么 *p = 10; // 指针前加 * 代表解引用,找到指针指向的内存中的数据 指针占的内存:在32位下占4字节,64位下占8字节 空指针:指针变量指向内存中编号为0的空间 作用:初始化指针变量 注意:空指针指向的内存是不可以访问的 野指针: const修饰指针的3种情况: const修饰指针:常量指针,指针指向的值不可以更改 const修饰常量:指针常量,指针的指向不可以改,(指针的指向就是内存地址,不可以指向别的内存地址) const既修饰指针,又修饰常量:都不可以改 普通变量作为函数参数时,是值传递,形参发生了变化,实参没有发生变化 指针作为函数参数时,作的是地址传递,实参发生变化 引用作函数参数时,简化指针, 结构体 struct 通过结构体指针访问结构体中的属性,需要利用 “ -> ” 符号 结构体指针作为函数参数的时候,避免了实参复制给形参的内存消耗, 因为结构体占用的内存为4(8)字节, 内存模型 C++程序在执行时,将内存分为4个区域 代码区:存放函数体二进制代码,由操作系统进行管理。共享、只读 全局区:存放全局变量和静态变量以及常量。程序结束时由操作系统回收 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 new 关键字表示 =》开辟内存 delete 关键字表示 =》释放内存 int *func() { // p存放在栈区,new开辟的内存在栈区,new返回的是该数据类型的指针 int *p = new int(10); return p; } int main() { int *p = func(); cout << "result:" << *p << endl; delete p; // 释放内存空间 // 释放数组:delete[] arr; 加一个中括号 return 0; } 引用:给变量起别名 数据类型 &别名 = 原名 引用的本质:在C++内部的实现就是一个指针常量 int &ref = a; 编译器会转换为:int * const ref = &a; // 指针常量时指针的指向不可以更改,也说明为什么引用不可以更改 using 关键字 =》 可以定义类型别名 类 class 访问权限 public private protected class和struct 的唯一区别在于 默认的访问权限不同 class 默认权限为私有 struct 默认权限为公共 构造函数:程序在声明对象的时候会自动调用,而且只会调用一次 析构函数:主要作用在于对象销毁前自动调用,执行一些清理工作 ~类名(){} 构造函数调用规则 默认情况下,C++编译器至少给一个类添加3个函数 默认构造函数 默认析构函数 默认拷贝构造函数 =》值传递的时候,会自动调用拷贝构造函数 浅拷贝:简单的赋值拷贝操作 深拷贝:在堆区重新申请空间,就行拷贝操作 如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题,因为默认拷贝构造是浅拷贝 当其它类对象作为本类成员,构造函数的调用是先调用其它类的构造,再调用本类的构造 析构的调用顺序,是相反的,先调用本类的析构,再调用成员的析构 静态成员:在成员变量或成员函数前加上关键字static 静态成员变量: 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 静态成员函数: 所有对象共享同一个函数 静态成员函数只能访问静态成员变量 成员变量和成员函数分开存储,只有非静态成员变量的内存占用 才属于类的对象上 空对象占用内存空间为 1字节,为了区分空对象占内存的位置 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码 那这一块代码是如何区分哪个对象调用自己的呢? this指针:指向被调用的成员函数所属的对象,它是隐含在每一个非静态成员函数内的一种指针,本质是指针常量 用途: 当形参和成员变量同名时,可用this指针来区分 在类的非静态成员函数中返回对象本身,可使用 return *this const 修饰成员函数 常函数: 成员函数后面加const,这个函数就是常函数,本质是修饰this的指向,让指针指向的值不可以被修改 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数内就可以修改 常对象: 声明对象前加const,这个对象就是常对象 常对象只能调用常函数 友元:让一个函数或者类,访问另一个类中的私有成员 关键字 friend 实现 全局函数做友元 类做友元 成员函数做友元 继承: 继承的方式,也有访问限制符修饰 公共继承public 保护继承protected 私有继承private 构造顺序 先父类后子类 析构顺序 先子类后父类 同名成员的处理: 1 子类对象可以直接访问到子类中同名成员 2 子类对象加作用域可以访问到父类同名成员 3 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中的同名函数 多继承,不建议 菱形继承 动物 羊 驼 羊驼 羊驼继承了两份数据,其实只需要一份就行了 解决:在继承之前,加上关键字 virtual 变为虚继承,基类就被称为 虚基类 vbptr:virtual base pointer 虚基类指针,指向vbtable :virtual base table 虚基类表 子类继承虚基类指针,虚基类指针通过偏移量找到同一份数据。 多态: 多态分为两类: 静态多态:函数重载 和 运算符重载,复用函数名。在编译阶段确定函数地址 动态多态:派生类和虚函数实现运行时多态。在运行阶段确定函数地址 多态原理: 一个类里面有一个虚函数,等于有了一个 虚函数指针 vfptr virtual function pointer, 指针指向虚函数表 vftable,表内部记录了虚函数的地址,当发生继承的时候,子类会继承vfptr、 vftable 当子类重写父类的虚函数,子类中的虚函数表 内部会替换成子类的虚函数地址 当父类的指针或者引用指向子类对象的时候,发生了多态 纯虚函数:virtual 返回值类型 函数名 (参数列表) = 0; 当类中有了纯虚函数,这个类也被称为 抽象类 特点:无法实例化对象;子类必须重写抽象类中的纯虚函数,否则也属于抽象类 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为 虚析构 或者 纯虚析构 虚析构 virtual ~类名(){} 纯虚析构 virtual ~类名() = 0; // 需要有声明,有实现 class Animal final {} // 加上final标识符,禁用继承; virtual void func() final{} // 虚函数加上final标识符,禁用重载; 文件操作 头文件<fstream> ofstream 写操纵 ifstream 读操作 fstream 读写操作 命名约定: 常量 全大写 全局变量 加“g_”前缀 函数 全小写 类名 首字母大写 成员变量 加“m_”前缀 命令: 查看文件类结构: cl /d1 reportSingleClassLayout类名 文件名1 输出预处理后的源码:g++ a.cpp -E -o a.cxx C++程序的生命周期: 编码 预处理 编译 运行 auto / decltype 自动类型推导关键字 lambda表达式 [](){},[]是lambda引出符,()包含参数,{}为函数体 auto func = [](){}; 智能指针: unique_ptr shared_ptr weak_ptr 模版:=> 泛型 函数模版、类模版:template<typename T> 模版可以重载 普通类中的成员函数一开始就可以创建 类模版中的成员函数在调用时才创建 STL:Standard Template Library 标准模版库,从广义上分为 容器、算法、迭代器 六大组件: 容器:各种数据结构:vector、list、deque、set、map等 算法:sort、find、copy、for_each等 迭代器:连接容器和算法 仿函数:行为类似函数,可作为算法的某种策略 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西 空间配置器:负责空间的配置与管理 vector: 与普通数组的区别:数组是静态空间,而vector可以动态扩展 动态扩展是指:找到更大的内存空间,然后将原数据拷贝到新空间,并释放原空间 string: string 和 char* 区别 char* 是一个指针 string 是一个类,类内部封装了 char* ,管理这个字符串,是一个 char* 型的容器 deque: 双端数组 stack: 栈,先进后出 queue: 队列,先进先出 list: 链表,STL中的链表是一个双向循环链表 set: 所有元素都会在插入时被自动排序(默认从小到大),底层是二叉树实现 set不允许有重复元素 multiset允许有重复元素 定义仿函数,可以自定义排序顺序 map: map中所有的元素都是pair,底层是二叉树实现 所有元素会根据key自动排序 map不允许重复的key multimap允许重复的key 仿函数:也叫函数对象 其实就是重载 operator() 谓词: 返回bool类型的仿函数称为谓词 STL仿函数: plus greater 等。。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.