不一样的C++语言
文章平均质量分 61
介绍在学习C++过程中对于C++的另外一种认识
kayyyuan
这个作者很懒,什么都没留下…
展开
-
40、不一样的C++系列--函数异常声明
函数异常声明首先来看一段代码:#include <iostream>#include <string>using namespace std;int func(int i, int j) throw(int, char){ if( (0 < j) && (j < 10) ) { return (i + j); } else {原创 2017-07-31 22:22:44 · 2019 阅读 · 0 评论 -
39、不一样的C++系列--类型识别
类型识别在面向对象中可能出现下面的情况 基类指针指向子类对象基类引用成为子类对象的别名//Base* Base& 静态类型//Derived 动态类型Base* p = new Derived();Base& r = *p;类型区别:静态类型 变量(对象)自身的类型动态类型 指针(引用)所指向对象的实际类型void test(Base* b){ //危险的转换方式原创 2017-06-25 11:58:40 · 658 阅读 · 0 评论 -
38、不一样的C++系列--C++的异常处理
C++的异常处理异常处理介绍C++内置了异常处理的语法元素 try … catch …try语句处理正常代码逻辑catch语句处理异常情况try语句中的异常由对应的catch语句处理语法:try{ double r = divide(1, 0);}catch(...){ cout << "Divided by zero..." << endl;}C++通过thr原创 2017-06-25 10:27:46 · 853 阅读 · 0 评论 -
37、不一样的C++系列--C语言异常处理
C语言异常处理异常的概念异常的说明 程序在运行过程中可能产生异常异常(Exception)与Bug的区别 异常是程序运行时可预料的执行分支Bug是程序中的错误,是不被预期的运行方式异常(Exception)和Bug的对比: 异常 运行时产生除0的情况需要打开的外部文件不存在数组访问时越界Bug 使用野指针堆数组使用结束后未释放选择排序无法处理长度为0的数组异常处理C语言原创 2017-06-25 08:40:12 · 981 阅读 · 0 评论 -
36、不一样的C++系列--单例类模板
单例类模板对于单例模式,我们都已经很熟悉了,这里我们来亲手制作一个单例类模板:目标:某些类在整个系统生命期中最多只能有一个对象存在(Single Instance)要控制类的对象数目,必须对外隐藏构造函数思路: 将构造函数的访问属性设置为private定义instance并初始化为NULL当需要使用对象时,访问instance的值 空值:创建对象,并用instance标记非空值:返回原创 2017-06-24 22:30:26 · 970 阅读 · 0 评论 -
35、不一样的C++系列--智能指针
智能指针智能指针是现代C++开发库中最重要的类模板之一,也是C++中自动内存管理的主要手段,能够在很大程度上避开内存相关的问题。STL中的智能指针auto_ptr生命周期结束时,销毁指向的内存空间不能指向堆数组,只能指向堆对象(变量)一片堆空间只属于一个智能指针对象多个智能指针对象不能指向同一片堆空间示例:#include <iostream>#include <string>#inc原创 2017-06-24 19:52:53 · 673 阅读 · 0 评论 -
34、不一样的C++系列--数组类模板
数组类模板首先先了解一个小知识点: 模板参数可以是数值型参数(非类型参数),例如这样:template<typename T, int N>void func(){ //使用模板参数定义局部数组 T a[N];}//使用func<double, 10>();这种数值型模板参数也有很多限制:变量不能作为模板参数浮点数不能作为模板参数类对象不能作为模板参数……..本原创 2017-06-24 18:07:57 · 1197 阅读 · 0 评论 -
33、不一样的C++系列--类模板与特化
类模板类模块的概念和意义在C++中有这样一些类:主要用于存储和组织数据元素类中数据组织的方式和数据元素的具体类型无关如:数组类,链表类,Stack类,Queue类等C++中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能。所以C++中的类模板是这样的:以相同的方式处理不同类型的数据在类声明前使用template进行标识< typename T >用原创 2017-06-24 10:25:35 · 1002 阅读 · 0 评论 -
32、不一样的C++系列--函数模板
函数模板泛型编程首先考虑一个问题:c++中有几种交换变量的方法?1、宏代码块:#define SWAP(t, a, b) \do \{ \ t c = a; \ a = b; \ b = c; \原创 2017-06-23 22:35:45 · 1103 阅读 · 0 评论 -
31、不一样的C++系列--多重继承
多重继承C++支持编写多重继承的代码 一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承所有父类的成员函数子类对象可以当作任意父类对象使用多重继承的语法规则//多重继承的本质与单继承相同class Derived : public BaseA, public BaseB, public BaseC{原创 2017-06-23 16:00:32 · 928 阅读 · 0 评论 -
30、不一样的C++系列--抽象类和接口
抽象类和接口抽象类面向对象中的抽象类可用于表示现实世界中的抽象概念是一种智能定义类型,而不能产生对象的类只能被继承并重写相关函数直接特征是相关函数没有完整的实现Shape是现实世界中各种图形的抽象概念因此: 程序中必须能够反映抽象的图形程序中通过抽象类表示图形的概念抽象类不能创建对象,只能用于继承纯虚函数C++语言中没有抽象类的概念C++中通过纯虚函数实现抽象类纯虚函数是指原创 2017-06-22 09:57:09 · 678 阅读 · 0 评论 -
29、不一样的C++系列--对象模型分析
对象模型分析C++对象模型首先来说一说class的本质:class是一种特殊的struct 在内存中class依旧可以看作变量的集合class与struct遵循相同的内存对齐规则class中的成员函数与成员变量是分开存放的 每个对象有独立的成员变量所有对象共享类中的成员函数然后再来看一个问题:class A{ int i; int j; char c;原创 2017-06-21 11:48:10 · 735 阅读 · 0 评论 -
28、不一样的C++系列--继承与多态
继承与多态父子间的同名冲突首先来看一段代码:#include <iostream>#include <string>using namespace std;class Parent{public: int mi;};class Child : public Parent{public: int mi;};int main(){ Child c; //这里原创 2017-06-20 10:27:26 · 757 阅读 · 0 评论 -
27、不一样的C++系列--继承的构造与析构
继承的构造与析构子类对象的构造子类中可以定义构造函数子类构造函数 必须对继承而来的成员进行初始化 直接通过 初始化列表 或者 赋值的方式 进行初始调用父类构造函数 进行初始化父类构造函数在子类中的调用方式 默认调用 适用于无参构造函数和使用默认参数的构造函数显示调用 通过 初始化列表 进行调用适用于所有父类构造函数 父类构造函数的调用class Child : public原创 2017-06-20 07:10:27 · 747 阅读 · 0 评论 -
26、不一样的C++系列--继承的基础知识
继承继承的概念类之间的两大关系:组合和继承:组合关系的特点: 将其它类的对象作为自己的成员使用当前类的对象与成员对象的声明期相同成员对象在用法上与普通对象完全一致组合关系的代码示例:class Memory{public: Memory() { cout << "Memory()" << endl; } ~Memory() {原创 2017-06-18 17:41:57 · 904 阅读 · 0 评论 -
25、不一样的C++系列--类型转换函数
类型转换函数基础类型转换标准数据类型之间会进行隐式的类型安全转换转换规则如下: (char -> short)-> int -> unsigned int -> long -> unsigned long -> float -> double举个例子:#include <iostream>#include <string>using namespace std;int main()原创 2017-06-18 14:54:25 · 612 阅读 · 0 评论 -
24、不一样的C++系列--i++和++i
前置操作符和后置操作符首先呢,我们来思考一个问题: //下面的代码有没有区别?为什么? i++; // i的值作为返回值,i 自增 1 ++i; // i自增 1, i 的值作为返回值如果从原生语义上讲,不一样,但是是在单条语句内,运算结果都一样。并且如果在单条语句内,编译器会进行优化,有的是作为原生语义来进行编译,有的是直接作为同一意思来进行的。所以: 现代编译器产品会原创 2017-06-15 09:03:15 · 772 阅读 · 0 评论 -
22、不一样的C++系列--函数调用操作符的重载
函数调用操作符的重载函数调用操作符(()) 只能通过类的成员函数重载可以定义不同参数的多个重载函数用法:Type operator () (){ return Type;}函数调用操作符的意义 函数调用操作符(())是可重载的函数调用操作符只能通过类的成员函数重载函数调用操作符可以定义不同参数的多个重载函数函数对象用于在工程中取代函数指针这里举个例子:#include原创 2017-06-12 09:13:55 · 755 阅读 · 0 评论 -
21、不一样的C++系列--数组操作符的重载
字符串类的兼容性存在的一些历史遗留问题C语言不支持真正意义上的字符串C语言用字符数组和一组函数实现字符串操作C语言不支持自定义类型,因为无法获取字符串类型C++语言直接支持C语言的所有概念C++语言中没有原生的字符串类型C++标准提供了字符串类(string类)string直接支持字符串连接string直接支持字符串的大小比较string直接支持子串查找和提取string直接支持字原创 2017-06-12 08:45:05 · 600 阅读 · 0 评论 -
20、不一样的C++系列--操作符重载
操作符重载C++中的重载能够扩展操作符的功能操作符的重载以函数的方式进行本质: 用特殊形式的函数扩展操作符的功能使用: 通过 operator 关键字可以定义特殊的函数operator 的本质是通过函数重载操作符语法:Type operator Sign(const Type& p1, const Type& p2){ Type ret; return ret;}原创 2017-06-11 16:49:24 · 485 阅读 · 0 评论 -
19、不一样的C++系列--友元
友元的介绍什么是友元?友元是C++中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系是单项的,不能传递友元的用法在类中以 friend 关键字声明友元类的友元可以是其它类或者具体函数友元不是类的一部分友元不受类中访问级别的限制友元可以直接访问具体类的所有成员友元的语法在类中用 friend 关键字对函数或类进行声明class Point{ double x;原创 2017-06-11 16:08:05 · 601 阅读 · 0 评论 -
18、不一样的C++系列--二阶构造模式
构造函数回顾关于构造函数的回顾 类的构造函数用于对象的初始化构造函数与类同名并且没有返回值构造函数在对象定义时自动被调用但是有没有发现,还是存在一些问题?1、如何判断构造函数的执行结果呢?2、在构造函数中执行return 语句会发生什么?3、构造函数执行结束是否意味着对象构造成功?就像这样:class Test{ int mi; int mj; bool mSt原创 2017-06-11 15:28:12 · 979 阅读 · 0 评论 -
17、不一样的C++系列--静态成员
静态成员变量在C++中可以定义静态成员变量静态成员变量属于整个类所有静态成员变量的生命期不依赖于任何对象可以通过类名直接访问公有静态成员变量所有对象共享类的静态成员变量可以通过对象名访问公有静态成员变量静态成员变量的特性在定义时直接通过static关键字修饰静态成员变量需要在类外单独分配空间静态成员变量在程序内部位于全局数据区语法规则:Type ClassName::VarName原创 2017-06-11 13:58:52 · 652 阅读 · 0 评论 -
16、不一样的C++系列--const对象与类成员的知识点
const对象const关键字能够修饰对象const修饰的对象为只读对象只读对象的成员变量不允许被改变只读对象是编译阶段的概念,运行时无效C++中的const成员函数const对象只能调用const的成员函数const成员函数中只能调用const成员函数const成员函数中不能直接改写成员变量的值const成员函数的定义:Type ClassName::function(Type p原创 2017-06-11 12:34:56 · 512 阅读 · 0 评论 -
15、不一样的C++系列--临时变量
临时变量首先看一段代码:#include <stdio.h>class Test { int mi;public: Test(int i) { mi = i; } Test() { Test(0); } void print() { printf("mi = %d\n", mi); }};i原创 2017-06-11 11:39:56 · 547 阅读 · 0 评论 -
14、不一样的C++系列--对象销毁
对象的销毁一般而言,需要销毁的对象都应该做清理解决方案 为每个类都提供一个public的free函数对象不再需要时立即调用free函数进行清理就比如这样:class Test{ int* p ;public: Test() {p = new int;} void free() {delete p;}}存在的问题 free只是一个普通的函数,必须显示的调用原创 2017-06-11 10:46:53 · 571 阅读 · 0 评论 -
23、不一样的C++系列--智能指针
智能指针内存泄露(臭名昭著的BUG) 动态申请堆空间,用完后不归还C++语言中没有垃圾回收的机制指针无法控制所指堆空间的生命周期就像这样:int main(){ for(int i=0; i<5; i++) { Test* p = new Test(i); cout << p->value() << endl; } return原创 2017-06-12 09:35:25 · 697 阅读 · 0 评论 -
13、不一样的C++系列--对象构造顺序
局部对象对于局部对象 当程序执行流到达对象的定义语句时进行构造举个栗子: int i = 0; Test a1 = i; while( i < 3 ) { Test a2 = ++i; } if( i < 4 ) { Test a = a1; } else { Test a原创 2017-06-11 10:26:31 · 463 阅读 · 0 评论 -
12、不一样的C++系列--初始化列表
类成员的初始化首先来看一段代码:#include <stdio.h>class Test{private: const int ci;public: Test() { ci = 10; } int getCI() { return ci; }};int main(){ Test t;原创 2017-06-11 10:01:38 · 479 阅读 · 0 评论 -
1、不一样的C++系列--C到C++的升级
C到C++的升级1、C plus plusC++继承了所有的C特性C++在C的基础上提供了更多的语法和特性C++的设计目标是运行效率与开发效率的统一(1)以C语言为基础(2)面向对象支持(3)类型、函数、异常加强2、实用性C++更强调语言的实用性 所有的变量都可以再需要使用时再定义for(int i=1; i<=3; i++){ for(int j=1; j<=3; j原创 2017-06-05 23:50:17 · 851 阅读 · 0 评论 -
2、不一样的C++系列--C++中的引用
C++中的引用在C++中新增加了引用的概念 引用可以看做是一个已定义变量的别名引用的语法: Type& name = var; int a = 4; int& b = a; //b为a的别名 b = 5; //操作b就是操作atip:普通引用在定义时必须用同类型的变量进行初始化。引用的意义引用作为变量别名而存在,因为在一些场合可以代替指针引用相对于指针来说具原创 2017-06-06 18:42:47 · 602 阅读 · 0 评论 -
3、不一样的C++系列--C++的内联函数
C++中的内联函数1、常量与宏回顾C++中的const常量可以替代宏常数定义,如:const int A = 3; <===> #define A 3宏是在预编译期间做了一下代码替换,不会出现在编译期2、内联函数C++中推荐使用内联函数替代宏代码片段C++中使用 inline 关键字声明内联函数inline int func(int a, int b){ return原创 2017-06-07 11:11:56 · 613 阅读 · 0 评论 -
4、不一样的C++系列--函数的默认参数和占位参数
C++函数参数的扩展函数参数的默认值C++中可以再函数声明时为参数提供一个默认值当函数调用时没有提供参数的值,则使用默认值int mul(int x = 0);int main(int argc, char *argv[]){ printf("%d\n", mul()); return 0;}int mul(int x){ return x * x;}在代码中,原创 2017-06-07 11:13:05 · 986 阅读 · 0 评论 -
5、不一样的C++系列--函数重载
C++中的函数重载重载的概念重载(Overload)–同一个标识符在不同的上下文有不同的意义。函数重载(Function Overload) 用同一个函数名定义不同的函数当函数名和不同的参数搭配时函数的含义不同用代码举个栗子:int func(int x){ return x;}int func(int a, int b){ return a + b;}int fun原创 2017-06-07 23:14:13 · 626 阅读 · 0 评论 -
6、不一样的C++系列--New关键字和命名空间
C++中New关键字和命名空间动态内存分配C++中的动态内存分配 C++中通过new关键字进行动态内存申请C++中的动态内存申请是基于类型进行的delete关键字用于内存释放变量申请:Type* pointer = new Type;// ....delete pointer;数组申请:Type* pointer = new Type[N];// ....delete[] pointer;原创 2017-06-07 23:17:19 · 740 阅读 · 0 评论 -
7、不一样的C++系列--C++类型转换
C++中的类型转换强制类型转换C方式的强制类型转换 (Type)(Expression)Type (Expression)发一个非常粗暴的转换栗子:typedef void(PF)(int);struct Point{ int x; int y;};int v = 0x12345;PF* pf = (PF*)v;char c = char(v);Point* p =原创 2017-06-07 23:18:48 · 388 阅读 · 0 评论 -
8、不一样的C++系列--面向对象
C++的面向对象面向对象基本概念面向对象的意义在于将日常生活中习惯的思维方式引入程序设计中将需求中的概念直观的映射到解决方案中以模块为中心构建可复用的软件系统提高软件产品的可维护性和可扩展性类和对象是面向对象中的两个基本概念类:指的是一类事物,是一个抽象的概念对象:指的是属于某个类的具体实体类是一种模型,这种模型可以创建出不同的对象实体对象实体是类模型的一个具体实例类和对象的意义类原创 2017-06-09 23:17:43 · 858 阅读 · 0 评论 -
9、不一样的C++系列--类与封装
类的封装类通常分为以下两个部分类的实现细节类的使用方式当使用类时,不需要关心其实现细节当创建类时,才需要考虑其内部实现细节封装的基本概念并不是类的每个属性都是对外公开的而一些类的属性是对外公开的必须在类的表示法中定义属性和行为的公开级别C++中类的封装成员变量:C++中用于表示类属性的变量成员函数:C++中用于表示类行为的函数C++中可以给成员变量和成员函数定义访问界别 pub原创 2017-06-09 23:18:44 · 815 阅读 · 0 评论 -
10、不一样的C++系列--类的真正形态
类的关键字struct 在C语言中已经有了自己的含义,必须继续兼容在C++中提供了新的关键字class用于类定义class和struct的用法是完全相同的那 struct 和 class 有什么区别呢?在用struct定义类时,所有成员的默认访问级别为public在用class定义类时,所有成员的默认访问界别为private例如这样:struct A{ //defualt to原创 2017-06-10 00:33:49 · 742 阅读 · 0 评论 -
11、不一样的C++系列--对象的构造
对象的初始化先上一段代码:#include <stdio.h>class Test{private: int i; int j;public: int getI() { return i; } int getJ() { return j; }};Test gt;int main(){ printf("gt.i = %d\n", gt.getI());原创 2017-06-10 00:35:28 · 867 阅读 · 0 评论