![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 79
harkecho
这个作者很懒,什么都没留下…
展开
-
从 lvalue到rvalue来分析i++与++i的区别
在代码中看到for循环体中用到的++i,和i++没什么区别在程序开发中,++i 与 i++的区别在哪里?为什么(i++)不能做左值,而(++i)可以// for (int i = 0; i < array.length; i++){} 和for (int i = 0; i < array.length; ++i){},他们在执行体内打印i的值都是相同的如下图所示 for (i...原创 2020-04-30 09:37:12 · 266 阅读 · 0 评论 -
C++类型转换
类型转换 C语言风格的类型转换符 (type)expression type(expression) C++中有4个类型h转换符 static_cast:对比dynamic_cast,缺乏运行时安全检测,不能交叉转换(不是同一继承体系的,无法转换),常用于基本数据类型的转换,非const转成const dynamic_cast...原创 2019-02-22 14:37:26 · 106 阅读 · 0 评论 -
C++ 11新特性
1 auto 可以从初始化表达式中推断出变量的类型,大大简化编程工作 属于编译器特性,不影响最总的机器码质量,不影响运行效率 2 decltype 可以获取变量的类型 int a = 10; decltype(a) b = 20;// int 3 nullptr 可以解决NULL的二义性问题,是null pointer空指针 4...原创 2019-02-22 15:27:18 · 152 阅读 · 0 评论 -
C++中的静态成员变量和静态成员函数
静态成员:所谓静态成员就是被static修饰的成员变量\函数 可以通过对象(对象.静态成员),对象指针(对象指针->静态成员),类访问(类名::静态成员) 静态成员变量:存储在数据段(全局区(全局区也叫数据段data segment),类似于全局变量),整个程序运行过程中只有一份内存,对比全局变量,它可以设定访问权限(public,protected,private)...原创 2019-02-18 14:20:05 · 255 阅读 · 0 评论 -
C++中的单例模式
C++中的单例模式 静态成员经典应用 - 单例模式: 在程序运行过程中,可能会希望某些类的实例对象永远只有一个 条件 1.把构造函数私有化 2.定义一个私有的静态成员变量指针,用于指向单例对象 3.提供一个公共的返回单例对象的静态成员函数. class Rocket { public: ...原创 2019-02-18 15:38:02 · 145 阅读 · 0 评论 -
C++中const成员
const成员:被const修饰的成员变量,非静态成员函数 const成员变量:必须初始化(类内部初始化),可以在声明的时候直接初始化赋值,非static的const成员变量还可以在初始化列表中初始化. const成员函数(非静态成员函数):const关键字写在参数列表后面,函数的声明和实现都必须带const.内部不能修改非static成员变量.内部只能...原创 2019-02-18 16:08:45 · 175 阅读 · 0 评论 -
C++引用类型成员与拷贝构造函数
引用类型成员:引用类型成员: 引用类型成员变量必须初始化(不考虑static情况). 在声明的时候直接初始化 通过初始化列表初始化 class Car { int age; int &amp;m_price = age; public: Car(int &amp;price...原创 2019-02-18 16:59:22 · 829 阅读 · 0 评论 -
(C++中的浅拷贝和深拷贝)C++中某个类中有成员变量中有指向新开辟的堆空间要自己写构造函数和拷贝构造函数
涉及到浅拷贝和深拷贝 class Car { int m_price; char *m_name; public: Car(int price = 0, const char *name = NULL) :m_price(price){ if (name == NULL) r...原创 2019-02-19 09:22:31 · 315 阅读 · 0 评论 -
栈区、堆区、全局区、文字常量区、程序代码区
一个由C/C++编译的程序占用的内存分为以下几个部分 : 参考文章原创 2019-02-19 10:56:47 · 147 阅读 · 0 评论 -
C++中匿名对象和隐式构造
匿名对象:没有变量名,没有被指针指向的对象,用完后马上调用析构 class Person { public: Person(){ cout &lt;&lt; "Person()" &lt;&lt; endl; } } Person (const Person &原创 2019-02-19 13:42:09 · 521 阅读 · 0 评论 -
C++的编译器在某些特定的情况下,会给类自动生成无参的构造函数
编译器自动生成的构造函数 C++的编译器在某些特定的情况下,会给类自动生成无参的构造函数,比如 成员变量在声明的同时进行了初始化 有定义虚函数 虚继承了其他类 包含了对象类型的成员,且这个成员有构造函数(编译器生成或自定义) 父类有构造函数(编译器生成或自定义) 总结一下: 对象创建后,需要做一...原创 2019-02-19 14:13:24 · 748 阅读 · 0 评论 -
C++的友元
友元: 友元包括友元函数和友元类 如果将函数A(非成员函数)声明为类C的友元函数,那么函数A就能直接访问类C对象的所有成员. 如果将类A声明为类C的友元类,那么类A的所有成员函数都能直接访问类C对象的所有成员. 友元破坏了面向对象的封装性,但在某些频繁访问成员变量的地方可以提高性能. class Point { friend Point...原创 2019-02-19 14:14:13 · 84 阅读 · 0 评论 -
C++ 内部类及局部类
内部类 如果将类A定义在类C的内部,那么类A就是一个内部类(嵌套类). 内部类的特点 支持public,protected,private权限. 成员函数可以直接访问其外部类对象的所有成员(反过来则不行) 成员函数可以直接不带类名,对象名访问其外部类的static成员 不会影响外部类的内部布局 可以在外部类内部声明,在外部类外部...原创 2019-02-19 14:44:25 · 430 阅读 · 0 评论 -
C++,运算符重载
外部定义运算符重载: class Point { friend Point operator+(const Point p1,const Point p2); int m_x; int m_y; public: Point(int x,int y):m_x(x),m_y(y) { ...原创 2019-02-19 14:57:05 · 95 阅读 · 0 评论 -
C++的异常捕捉
编程过程中的常见错误类型 语法错误 逻辑错误 异常:在程序运行过程中不好预测的错误,比如内存不够,异常没有处理,程序终止.try{}catch(...){cout << "发生了异常" << endl;} throw异常后,会在当前函数中查找匹配的catch,找不到就终止当前函数代码,去上一层函数中查找.如果最终都找不到匹配的catc...原创 2019-02-25 11:41:42 · 806 阅读 · 0 评论 -
C++的智能指针
智能指针(Smart Pointer) 传统指针存在的问题 需要手动管理内存 容易发生内存泄漏(忘记释放,出现异常等) 释放之后可能会产生野指针. 智能指针就是为了解决传统指针存在的问题 auto_ptr:属于C++9.8标准,在C++11中已经不推荐使用(有缺陷,比如不能用于数组) shared_ptr...原创 2019-02-25 14:57:48 · 149 阅读 · 0 评论 -
C++汇编理解a++,与++a的本质
int main() { int a = 10; int b = 0; b = a++ + 8; // a++汇编代码 mov eax, dword ptr [a] // 将a的值取出来赋值给eax,即eax = 10 add eax, 8 // 将...原创 2019-02-20 10:44:13 · 1047 阅读 · 0 评论 -
C++仿string实现的String方法
C++仿string实现的String方法String.h #include &lt;iostream&gt; using namespace std; class String { friend ostream &amp;operator&lt;&lt;(ostream &amp;,const String &amp;); priva原创 2019-02-20 14:49:02 · 238 阅读 · 0 评论 -
C++ 模板
模板(template) 泛型,是一种将类型参数化已达到代码复用的技术,C++中使用模板来实现泛型. 模板的使用格式如下 template &lt;typename\class T&gt; typename和class是等价的 模板没有被使用时,是不会被实例化出来的 模板的声明和实现如果分离到.h和.cpp中,会导致链接错误...原创 2019-02-21 15:09:15 · 105 阅读 · 0 评论 -
C++仿函数
仿函数:将一个对象当作一个函数来使用,仿函数是带状态的. // int sum(int a,int b){ // return a + b; // } class Sum { pulbic: int operator()(int a,int b){ re...原创 2019-02-21 14:35:07 · 107 阅读 · 0 评论 -
C++,对象的内存管理
struct Car { int m_price; //4个字节 Car(){ cout << "Car()" << endl; } ~Car(){ cout << "~Car()" << endl; } } stru...原创 2019-01-24 08:56:40 · 216 阅读 · 0 评论 -
C++,声明和实现的分类
// 声明和实现的分离 // 声明 .h头文件 class Person { int m_age; public: Person(); ~Person(); void setAge(int age); int getAge(); }; // 实现 .cpp 源文...原创 2019-01-24 09:12:39 · 229 阅读 · 0 评论 -
C++,命名空间
// 命名空间 #include <iostream> using namespace std; // namespace命名空间,可以用来避免命名冲突 class Person{ public: int m_age; }; namespace MHF{ // g_number是一个全局变量,写在函数外面的就是全...原创 2019-01-24 09:46:38 · 142 阅读 · 0 评论 -
C++,继承
struct Person { int m_age; void run() { cout << "Person()" << endl; } }; struct Student:Person{ int m_score; void study() { ...原创 2019-01-24 10:08:03 · 170 阅读 · 1 评论 -
C++,成员访问权限
// 成员访问权限,继承方式有3种 public:公共的,任何地方都可以访问(struct默认) protected:子类内部,当前类内部可以访问 private:私有的,只有当前类内部可以访问(class默认) struct Person { protected: int m_age; void run(){ ...原创 2019-01-24 14:14:44 · 238 阅读 · 0 评论 -
C++,初始化列表
初始化列表: // 特点:是一种便捷的初始化成员变量的方式,初始化顺序只跟成员变量的声明顺序有关,只能用到构造函数中 // 构造函数调用构造函数必须在构造函数初始化列表中调用 struct Person { int m_age; int m_height; int m_weight; Person(){ ...原创 2019-01-24 15:53:30 · 109 阅读 · 0 评论 -
C++中定义一个类,C++编码规范及窥探代码本质
面向对象: 类 对象 成员变量,成员函数 封装,继承,多态 C++中可以用struct,class来定义一个类 //struct和class的区别是权限不同:struct的默认成员权限是public,class的默认成员权限是private struct Person { // 成员变量 int age; ...原创 2019-01-22 09:32:30 · 438 阅读 · 0 评论 -
C++中,如果类中有多个成员变量,对象的内存是如何布局的?
// 如果类中有多个成员变量,对象的内存是如何布局的? 地址值 内存数据 12个字节&amp;amp;person.m_id &amp;amp;person 005DF7A0 005DF7A1 m_...原创 2019-01-22 09:31:05 · 459 阅读 · 0 评论 -
C++中引用的本质
//引用的本质 结论一: 当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量 int age = 10; const double &amp;rAge = age; age = 30; cout &lt;&lt; "age is" &lt;&lt; age &lt;&lt; endl原创 2019-01-21 09:07:45 · 155 阅读 · 0 评论 -
C++中的引用
在C语言中,使用Point(指针)可以间接获取,修改某个变量的值在C++中,使用引用(Reference),可以起到跟指针类似的功能.注意点:引用相等于是变量的别名(基本数据类型,枚举,结构体,类,指针,数组等,都可以有引用)对引用的计算,就是对引用所指向的变量做计算在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改吧,从一而终不存在引用的引用,指向引用的指针也是不存在的.引...原创 2018-11-13 13:31:07 · 225 阅读 · 0 评论 -
this是指向当前对象的指针
this是指向当前对象的指针 对象在调用成员函数的时候,会自动传入当前对象的内存地址 struct Person { int m_id; int m_age; int m_height; void display(){ cout << "m_id is" << this->m_...原创 2019-01-22 11:09:16 · 1392 阅读 · 0 评论 -
C++,初始化列表与默认参数配合使用
// 初始化列表与默认参数配合使用 class Person{ int m_age; int m_height; public: // 默认参数只能写在函数的声明中 Person(int age = 0,int height = 0); // 或者 Person(int age = 0,int height = 0):m_age(age),...原创 2019-01-28 08:09:14 · 1050 阅读 · 0 评论 -
C++,多态
// 多态:默认情况下,编译器只会根据指针类型调用对应的函数,不存在多态 多态是面向对象非常重要的一个特性 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果 在运行中,可以识别出真正的对象类型,调用对应子类中的函数 多态的要素: 子类重写父类的成员函数(override) 父类指针指向子类对象 利用父类指针调用重写的成员函数 ...原创 2019-01-28 10:42:38 · 123 阅读 · 0 评论 -
C++封装
// 封装:成员变量私有化,提供公共的getter和seter给外界去访问成员变量 struct Person{ private: int m_age; public: void setAge(int age){ if(age < 0)return; this->m_age = age; ...原创 2019-01-23 11:47:41 · 125 阅读 · 0 评论 -
内存空间的布局
每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域 代码段(代码区):用于存放代码. 数据段(全局区):用于存放全局变量(在C/C++中,定义在函数外面的就是全局变量,全局变量特点是整个程序运行过程中都存在,只要是全局变量它的内存会一直存在,比如植物大战僵尸,不可能把所有的植物和僵尸都变为全局变量,生命周期一直都存在,而且全局变量每个人都可以改,也无法控制权限). 栈...原创 2019-01-23 11:50:51 · 146 阅读 · 0 评论 -
C++构造函数
// 构造函数(Constructor):构造器,在对象创建的时候自动调用,一般用于完成对象的初始化工作 //特点:函数名与类同名,无返回值(void都n不能写),可以有参数,可以重载,可以有多个构造函数; 一旦定义了构造函数,必须用其中一个自定义的构造函数来初始化对象. 注意:通过malloc分配的对象不会调用构造函数 struct Person { int m_...原创 2019-01-23 15:16:38 · 632 阅读 · 0 评论 -
C++,默认情况下,成员变量的初始化
struct Person { int m_age; } // 自己没有写构造函数的初始化情况: // 全局区 Person g_person; int main(){ // 栈空间 Person person;// 栈空间的成员变量没有进行初始化 // 堆空间 Person *p1 = new Per...原创 2019-01-23 15:31:17 · 1239 阅读 · 0 评论 -
C++ 析构函数
//析构函数(Destructor):(析构器),在对象销毁的时候自动调用,一般用于完成对象的清理工作. 特点:函数名以~开头,与类同名,无返回值(void都不能写),无参,不可以重载,有且只有一个析构函数. 注意:通过malloc分配的对象free的时候不会调用构造函数 struct Person { // 构造函数:对象创建的时候调用 ...原创 2019-01-24 08:55:26 · 188 阅读 · 0 评论