C++
文章平均质量分 62
C++
诺谦
热爱生活 活在当下
展开
-
C++ new的时候判断null空指针操作可能成为bug,需要这么改
1.new异常的结果在C++中,通过new分配内存时,假如内存不够,会根据编译器版本不同来处理异常,对于老的编译器,会返回null空指针(和malloc一样).但是目前大多数标准编译器都是直接抛出异常的.测试代码如下所示:try{ for (int i = 0 ; i<1000;i++) { // 不停new,直到new分配失败为止 double *ptr=new double[1000000]; cout<<"i ...原创 2021-12-08 15:17:05 · 3550 阅读 · 5 评论 -
36.C++-模仿shared_ptr实现一个SharedPointer智能指针
在上章我们学习了35.C++-模仿auto_ptr实现一个SmartPointer智能指针_改变自己,成为最好的自己-CSDN博客所以本章来实现一个带共享的智能指针、1.共享智能指针介绍通过一个整型指针计数实现带有引用计数机制的功能,支持多个指针对象指向同一片内存(实现共享)但是它有一个缺点需要避免: 禁止用普通指针初始化多个共享智能指针,否则的话每个共享智能指针都会以为只有一个指针对象使用,从而导致内存多次释放、2.智能指针实现重写构造函数,如果无参数则初始化引用计数器原创 2021-12-07 16:41:12 · 577 阅读 · 0 评论 -
35.C++-模仿auto_ptr实现一个SmartPointer智能指针
在上章27.C++- 智能指针_改变自己,成为最好的自己-CSDN博客我们学习了智能指针,接下来我们便来自己模仿auto_ptr实现一个SmartPointer智能指针1.智能指针实现原理通过类模板实现,当生命周期结束时,然后通过析构函数达到主动释放指针 重写->指针操作符和*操作符,让类具有指针行为 重写拷贝构造函数, 并且拷贝时,需要将之前的地址置空,否则会出现多个指向相同地址的智能指针,当调用析构函数时程序会崩溃 重写=赋值操作符,让类A能赋值给类B,并且赋值前需要将类B自原创 2021-12-07 14:43:14 · 416 阅读 · 0 评论 -
34.C++-QT信号槽分析
moc 元对象编译器,全称是 Meta-Object Compiler,也就是“元对象编译器”。是QT翻译扩展语法到C++语言的工具,目前见扩展了信号与槽机制。信号/槽方式编程上更方便(不容易出错)回调需要自行处理麻烦的回调管理,稍微不注意就出错。而且信号/槽方式更利于mvc分离实现。信号和槽机制的优点:类型安全, 关联的信号和槽的参数必须是等同。降低Qt对象间的耦合度,只需要...原创 2021-06-29 00:37:00 · 214 阅读 · 0 评论 -
[C++]什么是“多态”
C++ Prime 里有原话(中文):这种“用基类的指针或引用操纵多个类型”的能力被称为多态(polymorphism)。例如有基类Camera, 他的子类有各种不一样的 camera,可以是佳能的,可以是尼康的...现在已知函数:void lookat(const Camera *pcamera);在实现lookat()时,只要对基类Camera的接口进行编程,而与 指针pcame...原创 2021-06-09 18:29:00 · 143 阅读 · 0 评论 -
32.C++-11版本推荐使用using定义别名(替代typedef)
大家都知道,在 C++中可以通过 typedef 重定义一个类型:typedef unsigned int uint_t;被重定义的类型并不是一个新的类型,仅仅只是原有的类型取了一个新的名字。但是不能用于模版别名,所以C++11版本推荐,通过using来代替typedef示例如下所示:template<typename T>class Test{public...原创 2020-12-07 17:06:00 · 455 阅读 · 0 评论 -
31.C++-虚函数之构造函数与析构函数分析
1.构造函数不能为虚函数当我们将构造函数定义为虚函数时,会直接报错:首先回忆下以前学的virtual虚函数概念:如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存空间上额外分配一个虚函数表.虚函数表的作用在于,存储每个类的相同的虚函数名,然后每一次虚函数调用,都会去虚函数表查找地址分析:假如构造函数是虚函数的话,由于对象开始还未分配内存空间,所...原创 2019-03-30 22:38:00 · 279 阅读 · 0 评论 -
30.C++复习篇
本章学习内容:1.const2.指针const3.inline内联函数4.函数重载5.extern “C”6.new/delete声明与释放7.namespace命名空间8.C++中的4种转换9.拷贝构造函数10.构造函数初始化列表11.析构函数12.const成员函数13.const对象14.栈、堆、静态存储区的区别15.静态成员变量/静态成员函数16.友元f...原创 2019-02-15 15:41:00 · 338 阅读 · 0 评论 -
29.C++- 异常处理
C++内置了异常处理的语法元素 try catchtry语句处理正常代码逻辑当try语句发现异常时,则通过throw语句抛出异常,并退出try语句catch语句处理异常情况当throw语句抛出异常时,则会直接跳到catch语句处理catch语句允许被重载,在try语句后面可以有多个catch语句不同类型的异常由不同的catch语句捕获,顺序从上往下严格匹配,不会进行隐式转换,比...原创 2018-04-14 16:14:00 · 128 阅读 · 0 评论 -
28.C++- 单例类模板(详解)
单例类描述指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针) ,比如:统计在线人数在单例类里,又分为了懒汉式和饿汉式,它们的区别在于创建实例的时间不同:懒汉式 :指代码运行后,实例并不存在,只有当需要时,才去创建实例(适用于单线程)饿汉式 :指代码一运行,实例已经存在,当时需要时,直接去调用即可(适用于多线程)...原创 2018-04-12 22:28:00 · 126 阅读 · 0 评论 -
27.C++- 智能指针
智能指针在C++库中最重要的类模板之一智能指针实际上是将指针封装在一个类里,通过对象来管理指针.STL中的智能指针auto_ptr头文件: <memory>生命周期结束时,自动摧毁指向的内存空间不能指向堆数组(因为auto_ptr的析构函数删除指针用的是delete,而不是delete[])auto_ptr的构造函数为explicit类型,所以只能显示初始化,比如...原创 2018-04-11 20:17:00 · 1436 阅读 · 0 评论 -
26.C++- 泛型编程之类模板(详解)
在上章25.C++- 泛型编程之函数模板(详解)学习了后,本章继续来学习类模板类模板介绍和函数模板一样,将泛型思想应用于类.编译器对类模板处理方式和函数模板相同,都是进行2次编译类模板通常应用于数据结构方面,使得类的实现不在关注数据元素的具体类型,而只关注需要实现的功能比如:数组类,链表类,Queue类,Stack类等使用方法通过template关键字来声明,然后通过type...原创 2018-04-10 18:48:00 · 198 阅读 · 0 评论 -
25.C++- 泛型编程之函数模板(详解)
本章学习:1)初探函数模板2)深入理解函数模板3)多参函数模板4)重载函数模板当我们想写个Swap()交换函数时,通常这样写:void Swap(int& a, int& b){ int c = a; a = b; b = c;}但是这个函数仅仅只能支持int类型,如果我们想实现交换double,float,string等等时,就还...原创 2018-04-09 17:14:00 · 168 阅读 · 0 评论 -
24.C++- 抽象类(存虚函数)、接口、多重继承
抽象类和接口什么是抽象类用来表示现实世界中的抽象概念是一种只能定义类型,而不能产生对象的类只能被子类继承,且抽象类的相关成员函数没有完整的体现,用来被子类重写.比如图形(Shape)类, 就是一个抽象的概念,因为我们无法计算这个“图形”的面积,所以它的成员函数area()是空的。而继承它的子类(矩形,圆形,三角形等)就可以去重写area()成员函数. 里面通过数学公式,计算出面积...原创 2018-04-08 11:30:00 · 106 阅读 · 0 评论 -
23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
上章链接:22.C++- 继承与组合,protected访问级别继承方式继承方式位于定义子类的”:”后面,比如:class Line : public Object //继承方式是public{};继承方式默认为private在C++中,继承方式共有3种:public继承-指父类的成员(变量和函数)访问级别,在子类中保持不变private继...原创 2018-04-02 22:22:00 · 203 阅读 · 0 评论 -
22.C++- 继承与组合,protected访问级别
在C++里,通过继承和组合实现了代码复用,使得开发效率提高,并且能够通过代码看到事物的关系组合比继承简单,所以在写代码时先考虑能否组合,再来考虑继承.组合的特点将其它类的对象作为当前类的成员使用比如主机类,拥有 CPU/主板/内存/硬盘这4个对象成员,而这4个对象成员并没有继承主机类的特性和行为继承的特点新的类(子类)具有旧的类(父类)的属性和行为旧的类被称为父类,也叫基类...原创 2018-04-02 22:01:00 · 154 阅读 · 0 评论 -
21.C++- “++“操作符重载、隐式转换之explicit关键字、类的类型转换函数
++操作符重载++操作符分为前置++和后置++,比如: ++a; a++;++操作符可以进行全局函数或成员函数重载重载前置++操作符不需要参数重载后置++操作符需要一个int类型的占位参数前置++操作符的返回值为*this后置++操作符的返回值为临时对象例如:class Test{ int mValue;public: Test(int i) ...原创 2018-03-28 19:24:00 · 164 阅读 · 0 评论 -
20.C++- “&&“,“||“逻辑重载操作符的缺陷、“,“逗号重载操作符的分析
"&&","||"逻辑重载操作符的缺陷大家,都知道"&&","||"拥有"短路"功能比如a=(0&&b) : 由于第一个操作数为0,所以不会去判断b的内容,直接执行a=0比如a=(-100||b): 由于-100不为0,所以不会去判断b的内容,直接执行a=1可以参考下面代码:int func(int i){ cout &...原创 2018-03-27 23:00:00 · 142 阅读 · 0 评论 -
19.C++-(=)赋值操作符、初步编写智能指针
(=)赋值操作符编译器为每个类默认重载了(=)赋值操作符默认的(=)赋值操作符仅完成浅拷贝默认的赋值操作符和默认的拷贝构造函数有相同的存在意义(=)赋值操作符注意事项首先要判断两个操作数是否相等返回值一定是 return *this; 返回类型是Type&型,避免连续使用=后,出现bug比如:class Test{ int *p; Te...原创 2018-03-27 17:14:00 · 157 阅读 · 0 评论 -
18.C++-[ ]操作符使用 、函数对象与普通函数区别(详解)
在上章17.C++-string字符串类(详解)学习了string类,发现可以通过[ ]重载操作符来访问每个字符。比如:string s="SAD";for(int i=0,i< s.length();i++)cout<<s[i]<<endl;接下来,我们来自己写个[ ]重载操作符,来模拟string类#include <iostream&...原创 2018-03-26 00:11:00 · 134 阅读 · 0 评论 -
17.C++-string字符串类(详解)
C++字符串string类在C语言里,字符串是用字符数组来表示的,而对于应用层而言,会经常用到字符串,而继续使用字符数组,就使得效率非常低.所以在C++标准库里,通过类string从新自定义了字符串。头文件: #include <string>string直接支持字符串连接string直接支持字符串的大小比较string直接支持子串查找和提取string直接支持字符串...原创 2018-03-24 23:56:00 · 329 阅读 · 0 评论 -
16.C++-初探标准库
在别人代码里,经常看到std命名空间,比如使用std命名空间里的标准输入输出流对象cout:#include<iostream> using namespace std;int main(){ cout << "Hello world" << endl; return 0;}其中cout相当于控制台输出(...原创 2018-03-24 23:42:00 · 105 阅读 · 0 评论 -
15.C++-操作符重载、并实现复数类
首先回忆下以前学的函数重载函数重载函数重载的本质为相互独立的不同函数通过函数名和函数参数来确定函数调用无法直接通过函数名得到重载函数的入口地址函数重载必然发生在同一个作用域中类中的函数重载静态成员函数能与普通成员函数建立重载关系全局函数和成员函数不能构成重载关系操作符重载(operator)什么是操作符重载?大家都知道,在C里,有'+,-,*,/'这些操作符,且它...原创 2018-03-23 22:57:00 · 145 阅读 · 0 评论 -
14.C++-二阶构造模式、友元(详解)
首先回顾以前所学的构造函数类的构造函数用于对象的初始化构造函数与类同名并且没有返回值构造函数在定义时被自动调用由于构造函数没有返回值不能判断执行结果,所以不能保证初始化对象能否成功比如:class Test{private: int *p;public: Test(int i) { p=new int(i); }}假如创建对象时...原创 2018-03-19 16:13:00 · 123 阅读 · 0 评论 -
13.C++-静态成员变量、静态成员函数
首先回顾下成员变量能通过对象名能够访问public成员变量每个对象的成员变量都是专属的成员变量不能在对象之间共享再来讲讲类的静态成员变量介绍静态成员变量属于整个类所有静态成员变量的生命期不依赖于任何对象(如同全局变量)可以通过类名直接访问公有(public)静态成员变量所有对象共享类的静态成员变量可以通过对象名访问公有(public)静态成员变量特性在类里定义时直接...原创 2018-03-19 09:44:00 · 129 阅读 · 0 评论 -
12.C++-构造与析构函数的调用,const成员函数,const对象,this指针
单个对象创建时,构造函数的调用顺序1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同)3.最后调用对象本身类的构造函数单个对象被注销后,调用的析构函数与对应构造函数的调用顺序相反参考下面示例,创建两个类Member,Test,然后Tesrt成员包含了Member类的成员:#inc...原创 2018-03-17 19:41:00 · 362 阅读 · 0 评论 -
11.C++-临时对象分析
首先来参考以下代码:#include <stdio.h>class Test { int mi;public: Test(int i) { mi = i; } Test() { Test(0); } void print() { printf("mi = %d\n", mi); ...原创 2018-03-16 21:43:00 · 112 阅读 · 0 评论 -
10.C++-构造函数初始化列表、显示初始化和隐式初始化、类const成员、对象构造顺序、析构函数...
首先回忆下,以前学的const单独使用const修饰变量时,是定义的常量,比如:const int i=1;使用volatile const修饰变量时,定义的是只读变量使用const & 修饰变量时,定义的是只读变量在类中是否可以定义const成员?直接来写代码:#include <stdio.h>class Test{private: const i...原创 2018-03-16 19:18:00 · 152 阅读 · 0 评论 -
9.C++-对象的构造函数、拷贝构造函数(详解)
大家都定义struct或class时,不能给成员直接赋值,那么对象中成员变量的初始值是多少?对于局部对象变量而言,其成员是个随机值,因为该变量是被分配在栈上,对于其它局部变量也是这样.对于全局对象变量而言,其成员都为0,因为该变量是被分配在静态存储区上,对于const修饰就是分配在只读静态存储区上.对于使用malloc分配的对象变量而言,其成员是个随机值,因为用户分配的地址是存在堆上对于...原创 2018-03-16 13:41:00 · 186 阅读 · 0 评论 -
8.C++-类的关键字
在之前学习的C++章节里,可以发现结构体越来越不像C语言里的结构体了比如,里面可以定义函数,可以定义private/public,结构体名还可以指向父类.但是C++需要兼容C,所以C++中便提供了新的关键字class用来定义类class关键字class和struct用法完全相同(struct A == class B)class与struct区别(如下图)在struct中,所有成员的...原创 2018-03-08 23:31:00 · 232 阅读 · 0 评论 -
7.C++类与封装的概念
类通常分为以下两部分-类的内部具体实现-类的外部使用方法比如:用户使用手机,只需要知道如何使用.而手机开发者,则需要考虑手机内部的实现细节.类的封装并不是类的每个成员变量和成员函数都要对外公开比如:女孩不希望外人知道自己的体重weight和年龄age男孩不希望外人知道自己的身高height和工资salary而某些属性是对外公开的比如:姓名,学历,国籍等.所以在类里,...原创 2018-03-07 23:08:00 · 81 阅读 · 0 评论 -
6.C++初步分析类
面向对象的意义在于:-将日常生活中习惯的思维方式引入程序设计中-将需求中的慨念直观的映射到解决方案中-以模块为中心构建可复用的软件系统-提高软件产品的可维护性和可扩展性其中类和对象是面向对象中的两个基本概念-类:指的一类事物,里面包括不同对象实体,是一个抽象的概念,比如:程序语言-对象:指的是类里的具体实体,比如:程序语言(类)->java(对象)、C#(对象)等类-...原创 2018-02-23 23:50:00 · 118 阅读 · 0 评论 -
5.C++里的4种新型类型转换
1首先来回顾C的强制转换大家都知道,在编译C语言中的强制转换时,编译器不会检查转换是否成功,都会编译正确.比如:#include "stdio.h"struct Position{int x;int y;};int main(){ int i; struct Position *p; i=0x123456; p=(struct Position *)i;...原创 2018-02-20 23:24:00 · 858 阅读 · 0 评论 -
4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
本章主要内容:1)函数重载2)C++调用C代码3)new/delete关键字实现动态内存分配4)namespace命名空间大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比如”玩”:玩游戏玩卡牌玩足球所以在C++中,便出现了函数重载(JAVA,c#等语言都有函数重载)1.函数重载(overload)表示有多个相同的函数名(类似上面的”玩”),...原创 2018-02-15 18:54:00 · 157 阅读 · 0 评论 -
3.C++内联函数,默认参数,占位参数
本章主要内容:1)内联函数(替代宏代码段)2)默认参数3)占位参数1.C++的内联函数分析1.1讲解内联函数之前,首先回忆下之前讲的define宏定义:之前讲过宏定义会经过预处理器进行文本替换,缺点就在于没有类型检查,没有任何编译过程,编译器根本不知道类型是什么.所以,C++中,当需要某个类型的常量时,可以使用const常量来替代宏常数,如:const int A=3; ...原创 2018-02-13 13:03:00 · 99 阅读 · 0 评论 -
2.C++中的bool类型,三目运算符,引用
本章主要内容:1)bool类型2)三目运算符3)引用1.布尔型bool在C++中,bool类型只有true(非0)和flase(0)两个值,且bool类型只占用了一个字节.例如:#include <stdio.h>int main(){ bool b=false; printf("b=%d\n",b); b=-5; //由于-5...原创 2018-02-09 20:32:00 · 243 阅读 · 0 评论 -
1.C和C++区别,以及const分析(底层const/顶层const)
从本章起开始从0学习C++,本章主要内容:1)C和C++的基本区别2)C和C++的const区别1.C++和C区别1.1 C++更强调语言的实用性,所有变量都可以在需要时再定义比如:for(int i=0;i<100;i++);1.2 C++不允许定义多个同名全局变量,而C却可以重复定义1.3 C++的register只是个兼容作用1.4 C++的所有标识符都必...原创 2018-02-09 20:12:00 · 175 阅读 · 0 评论