
C++
文章平均质量分 73
CMbug
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【七】C++一些新的关键字 -- new、delete、强制类型转换
1、动态内存分配C++中的动态内存分配已经和C语言有了明显区别: C++中通过new关键字进行动态内存申请 C++中的动态内存申请是基于类型进行的 delete关键字用于内存释放 变量申请和释放:Type* pointer = new Type; // …… delete pointer; 数组申请和释放:Type* pointer = new Type[N]; // …… delete[原创 2015-08-23 14:55:34 · 2435 阅读 · 0 评论 -
【二】C++基于C的一些改变
1、布尔类型 C++在C语言的基本类型系统之上增加了bool; 实际上,C99的标准中也引入了bool类型,使用时需要引用stdbool.h头文件 C++中的bool可取的值只有truea和false; 理论上bool只占用一个字节,如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现; C++编译器会在赋值时将非0值转换为true,0值转换为false; Tip: true原创 2015-08-14 11:01:03 · 769 阅读 · 0 评论 -
【六】C & C++ 函数相互调用
在项目中融合C++和C代码是实际工程中不可避免的,虽然C++编译器能够兼容C语言的编译方式,但C++编译器会优先使用C++的方式进行编译,为了让它们能互相调用,可以利用extern关键字强制让C++编译器对代码进行C方式编译! 1、C++调用C编写的函数假设有如下的代码: main.cpp#include <iostream> #include "test.h"using namesp原创 2015-08-15 16:54:21 · 1940 阅读 · 0 评论 -
【五】C++函数的升级(二)
目录目录 1函数默认参数 2函数占位参数1、函数默认参数 C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替 只有参数列表后面部分的参数才可以提供默认参数值 一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值 示例:exp-1.cpp#include <stdio.h>int add(int a, int b =原创 2015-08-15 11:47:48 · 595 阅读 · 0 评论 -
【三】C++引用机制
目录目录 1变量名回顾 2引用的概念 3引用的意义 4const引用 5引用的本质 6函数返回引用 7C对三目运算符做了什么 8小结 1、变量名回顾 变量是一段实际连续存储空间的别名 程序中通过变量来申请并命名存储空间 通过变量的名字可以使用存储空间 如图: 思考: 对于一段连续的存储空间只能有一个别名吗? 肯定不是,因此我们可以给同一个连续的存储空间取多个别名,这就诞生原创 2015-08-14 16:52:19 · 1658 阅读 · 0 评论 -
【八】疑难问题小结(一 -- 七篇)
目录目录 1const和引用的疑惑 什么是符号表符号表存储在程序中的哪个地方 怎样定义const常量才会使用符号表 2引用与指针的疑惑 指针与引用的区别 如何理解引用的本质就是指针常量 3重载与默认类型转换 C编译器对字面量的处理方式 当使用字面量对变量进行初始化或赋值时 深入理解重载规则 4C方式编译的疑惑 深入理解extern C1、const和引用的疑惑关于const和引用的疑难问题,在前面的原创 2015-08-17 13:38:19 · 1006 阅读 · 0 评论 -
【十】运算符重载(上)
1、C++标准库 C++标准库并不是C++语言的一部分 C++标准库是由C++语言编写而成的类库和函数的集合 C++标准库中定义的类和对象都位于std命名空间中 C++标准库的头文件都不带.h后缀 C++标准库涵盖了C库的功能 C库中name.h头文件对应C++中的cname头文件 C++标准库预定义了多数常用的数据结构,如:字符串,链表,队列,栈等 示例:一个类C风格的C++程序:#include原创 2015-08-22 18:05:22 · 522 阅读 · 0 评论 -
【一】C++基于C的一些改变
1、register关键字的变化 register关键字请求“编译器”将局部变量存储于寄存器中 C语言中无法取得 register 变量地址 在C++中依然支持register关键字 C++编译器有自己的优化方式,不使用register也可能做优化 C++中可以取得 register 变量的地址 C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。原创 2015-08-13 17:12:57 · 1090 阅读 · 0 评论 -
【四】C++函数的升级(一)--内联函数
目录目录 1宏的回顾 2内联函数的使用 3内联函数 4内联函数的特点 4编译器的优化 5内联编译的限制 6内联实现机制1、宏的回顾 在C语言中,可以定义宏常量和宏代码片段,但是它们各自都有不足,它们都是在预编译阶段进行简单的文本替换,没有类型安全等相关检查; 在C++中,宏常量可以用const常量代替,并且const常量会更加安全,它在编译阶段进行处理; const int A = 3; <==>原创 2015-08-15 11:13:31 · 1069 阅读 · 0 评论 -
【二十】一个面试题
面试题: 写函数判断一个变量是否为指针?要解决这个问题,要用一个巧妙的方法,先回顾一下相关知识点: C++中仍然支持C语言中的可变参数函数 C++编译器的函数匹配调用优先级 重载函数 函数模板 可变参数函数 Tip: 如果同时存在普通函数和其重载版本、模板函数、可变参数函数,编译器会优先调用普通函数和其重载版本,然后依次时模板函数和可变参数函数!示例:#include <cstdlib> #i原创 2015-08-28 10:44:16 · 703 阅读 · 0 评论 -
【十九】一些实际工程中的问题
1、Bug 在实际工程中内存操作是bug的重要来源 C++将堆内存交由开发人员自由使用,因此 未及时释放,将产生内存泄漏 重复释放同一段内存,行为未知 使用越界,操作了不属于自己的内存 思考: 怎样最大限度的避开上述的使用问题?2、数组类 内存越界的问题常发生于数组的使用中 解决方案:数组类工程中,在非特殊情况下,要求开发者使用预先编写的数组类对象代替C++语言中的原生数组,而其实C++中也原创 2015-08-27 12:17:49 · 749 阅读 · 0 评论 -
【十八】类模板(下)
本篇接着上一篇的内容介绍!1、类模板多个类型参数和函数模板一样,一个类模板也可以定义多个类型参数! 如下:#include <iostream> using namespace std;template <typename T1, typename T2> class Test { public: void test(T1 a, T2 b) { cout << static_cas原创 2015-08-26 16:42:12 · 632 阅读 · 0 评论 -
【十】类的静态成员
1、类的静态成员 在C++中可以定义静态成员变量和静态成员函数 静态成员属于整个类所有,不需要依赖任何对象,会在全局数据区分配空间 静态成员可以是public、private和protected的 可以在类外,通过类名或者对象名直接访问public静态成员 不可以在类外,访问private或protected静态成员 类的成员函数不用通过作用域运算符,就可以直接访问静态成员变量 2、静态原创 2015-08-23 16:36:59 · 702 阅读 · 0 评论 -
【九】面向对象的相关概念
目录目录 1基本概念 2C中类的封装 3构造函数 4初始化列表 5类中的const成员 6初始化与赋值 7析构函数 8构造与析构的调用顺序1、基本概念 类和对象的基本概念 “类”指的是一类事物,是一个抽象的概念 “对象”指的是属于某个类的一个实体,是一个具体存在的事物 Tip: 类是一种“模板”,可以通过这种模板创建出不同的对象“实例” 对象“实例”是类“模板”的一个具体实现原创 2015-08-19 11:40:16 · 679 阅读 · 0 评论 -
【十二】初探继承
1、继承概念面向对象中的继承指类之间的父子关系 子类拥有父类的所有成员变量和成员函数 子类就是一种特殊的父类 子类对象可以当作父类对象使用 子类可以拥有父类没有的方法和属性 示例:class Parent { private: int a; public: Parent() { a = 100; } void print() { cout << "a = "原创 2015-08-24 10:15:25 · 618 阅读 · 0 评论 -
【十三】继承中的构造与析构
1、赋值兼容性原则 子类对象可以当作父类对象使用 子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对象 父类引用可以直接引用子类对象 所以,在上一篇文章中说: 子类是就是特殊的父类!!!2、继承对象模型 类在C++编译器的内部可以理解为结构体 子类是由父类成员叠加子类新成员得到的 3、继承和构造与析构思考: 一个从父类继承来的子类在构造时,如何初始化原创 2015-08-24 11:56:42 · 834 阅读 · 0 评论 -
【十五】继承与多态(下)
1、重载和重写思考:重载和重写有什么区别?什么时候是重载,什么时候是重写? 函数重载 必须在同一个类中进行 子类无法重载父类的函数,父类同名函数将被覆盖 重载是在编译期间根据参数类型和个数决定调用函数 函数重写 必须发生于父类与子类之间 并且父类与子类中的函数必须有完全相同的原型 使用virtual声明之后能够产生多态 多态是在运行期间根据具体对象的类型决定调用函数 举例: 假如有如下两个类:原创 2015-08-24 17:14:46 · 677 阅读 · 0 评论 -
【十四】继承与多态(上)
1、函数重写上一篇文章中说到,当子类定义一个与父类同名的成员变量时,父类的该成员变量依然会被继承到子类,它们两者可通过作用域限定符来区分,那么,如果子类中定义了和父类相同类型且同名的函数又会怎样呢?这就是函数重写! 在子类中定义与父类中原型相同的函数 函数重写只发生在父类与子类之间 #include <cstdlib> #include <iostream>using namespace std;c原创 2015-08-24 15:11:46 · 682 阅读 · 0 评论 -
【十六】函数模板
1、引入泛型编程在以前C语言中,如果一个函数要处理不同的数据类型,那么需要为每种数据类型都定义一个函数实行,例如下面的函数:void Swap(int& a, int& b) { int temp = a; a = b; b = temp; }void Swap(char& a, char& b) { char temp = a; a = b; b = temp; }void原创 2015-08-25 17:08:38 · 594 阅读 · 0 评论 -
【十七】类模板(上)
1、引入类模板C++中可以将模板的思想应用于类,使得类可以不关注具体操作的数据类型,而只关注类所需要实现的功能。C++中的类模板 提供一种特殊的类以相同的行为处理不同的类型 在类声明前使用template进行标识 < typename T> 用于说明类中使用的泛指类型 T 在模板类外部定义成员函数的实现时,需要加上template < typename T>的声明,并且类作用域为:classname原创 2015-08-26 11:17:23 · 588 阅读 · 0 评论 -
【十一】运算符重载(下)
1、回顾上一节 上一节中,我们通过了两个全局友元函数进行了运算符重载,并且简单说明了如何进行类成员函数的运算符重载,这里首先将全局重载函数改写为成员重载函数! 示例: #include using namespace std; class Complex { private: int a; int b; public: Complex(int i = 0, in原创 2015-08-23 09:54:16 · 769 阅读 · 0 评论