![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 77
老姚大大
精通C/C++,熟悉Java,Linux应用开发,Linux驱动开发,Android系统开发
展开
-
15-类与封装的概念
类与封装的概念类的封装类通常分为两个部分:类的实现细节类的使用方式当使用类时,不需要关心其实现细节;当创建类时,才需要考虑其内部实现细节。封装的基本概念:并不是类的每个属性都可以对外公开的而一些类的属性是对外公开的必须在类的表示法中定义属性和行为的公开级C++中类的封装:成员变量:C++中用于表示类属性的变量成员函数:C++中用于表示类行为的函数C++中可以给成员变量和成员函数定义访问级别publ...原创 2018-04-10 16:23:35 · 152 阅读 · 0 评论 -
40-前置操作符和后置操作符
40-前置操作符和后置操作符值得思考的问题下面的代码有没有区别?为什么?i++; // i的值作为返回值,i自增1++i; // i自增1,i的值作为返回值【范例代码】真的有区别吗?#include <iostream>#include <string>using namespace std;int main(int argc, const char...原创 2018-05-17 15:08:21 · 153 阅读 · 0 评论 -
41-类型转换函数(上)
41-类型转换函数(上)再论类型转换标准数据类型之间会进行隐式的类型安全转换:转换规则如下:char -> short -> int -> unsigned int -> long -> unsigned long -> float -> double【范例代码】有趣的隐式类型转换#include <iostream>#include <...原创 2018-05-18 11:11:59 · 103 阅读 · 0 评论 -
42-类型转换函数(下)
42-类型转换函数(下)【问题】类类型是否能够类型转换到普通类型?类型转换函数C++类中可以定义类型转换函数类型转换函数用于将类对象转换为其他类型语法规则:operator Type () { Type ret; // ... return ret;}类型转换函数:与构造函数具有同等的地位使得编译器有能力将对象转化为其他类型编译器能够隐式的使用类型转换函数【注意】编译器会...原创 2018-05-18 13:12:53 · 95 阅读 · 0 评论 -
32-初探C++标准库
32-初探C++标准库C++标准库并不是C++语言的一部分C++标准库是由类库和函数库组合的集合C++标准库中定义的类和对象都位于std命名空间中C++标准库的头文件都不带.h后缀C++标准库涵盖了C库的功能C++标准库预定义了多数常用的数据结构:--<bitset> --<set> --<cstdio> --<deque> ...原创 2018-04-28 18:28:03 · 124 阅读 · 0 评论 -
33-C++中的字符串
3-C++中的字符串历史遗留问题C语言不支持真正意义上的字符串C语言用字符数组和一组函数实现字符串操作C语言不支持自定义类型,因此无法获得字符串类型解决方案:从C到C++的进化过程引入了自定义类型在C++中可以通过类完成字符串类型的定义标准库中的字符串类C++语言直接支持C语言的所有概念C++语言中没有原生的字符串类型C++标准库提供了string类型:string直接支持字符串连接string直...原创 2018-04-28 20:14:47 · 184 阅读 · 0 评论 -
34-数组操作符的重载
34-数组操作符的重载【问题】string类对象还具备C方式字符串的灵活性吗?还能直接访问单个字符吗?字符串类的兼容性string类最大限度的考虑了C字符串的兼容性可以按照使用C字符串的方式使用string对象string s = "a1b2c3d4e";int n = 0;for (int i = 0; i < s.length(); i++) { if (isdigit(s...原创 2018-05-16 15:55:26 · 123 阅读 · 0 评论 -
35-函数对象分析
35-函数对象分析客户需求编写一个函数:函数可以获得非伯纳骑术列每项的值每调用一次返回一个值函数可根据需要重复使用【范例代码】第一个解决方案#include <iostream>#include <string>using namespace std;int fib() { static int a0 = 0; static int a1 = 1;...原创 2018-05-16 16:44:40 · 80 阅读 · 0 评论 -
36-经典问题解析三
36-经典问题解析三关于赋值的疑问【问题】什么时候需要重载赋值操作符?编译器是否提供默认的赋值操作?编译器为每个类默认重载了赋值操作符默认的赋值操作符仅完成浅拷贝当需要进行深拷贝时必须重载赋值操作符赋值操作符与拷贝构造函数有相同的存在意义【范例代码】默认赋值操作符重载#include <iostream>#include <string>using namespace...原创 2018-05-16 17:44:48 · 104 阅读 · 0 评论 -
7-函数参数的扩展
7-函数参数的扩展函数参数的默认值C++中可以在函数声明时为参数提供一个默认值当函数调用时没有提供参数的值,则使用默认值int mul(int x = 0);int main(int argc, char *argv[1]) { printf("%d\n", mul()); // mul(0) return 0;}int mul(int x) { retur...原创 2018-06-04 14:41:08 · 116 阅读 · 0 评论 -
6-内联函数分析
6-内联函数分析常量与宏回顾C++中的const常量可以替代宏常数定义,如:const int A = 3; <--> #define A 3【问题】C++中是否有解决方案替代宏代码片段呢?内联函数C++中推荐使用内联函数替代宏代码片段C++中使用inline关键字声明内联函数inline int func(int a, int b) { return a < b ? a...原创 2018-06-04 17:26:04 · 116 阅读 · 0 评论 -
10-C++的新成员
10-C++的新成员动态内存分配C++中的动态内存分配:C++中通过new关键字进行动态内存申请C++中的动态内存申请是基于类型进行的delete关键字用于内存释放// 申请变量Type* pointer = new Type;// ......delete pointer;// 数组申请Type* pointer = new Type[N];// ......delete[] p...原创 2018-05-24 11:07:52 · 90 阅读 · 0 评论 -
43-继承的概念和意义
43-继承的概念和意义【问题】类之间是否存在直接的关联关系?继承的概念【范例代码】组合关系的描述#include <iostream>#include <string>using namespace std;class Memory {public: Memory() { cout << "Memory()" <<...原创 2018-06-05 10:38:56 · 306 阅读 · 0 评论 -
44-继承中的访问级别
44-继承中的访问级别【问题】子类是否可以直接访问父类的私有成员?【范例代码】继承中的访问级别#include <iostream>#include <string>using namespace std;class Parent {private: int mv;public: Parent() { mv = 100; ...原创 2018-06-05 16:33:40 · 126 阅读 · 0 评论 -
8-函数重载分析(上)
8-函数重载分析(上) 重载的概念重载:同一个标识符在不同的上下文有不同的意义C++中的重载函数函数重载:用同一个函数名定义不同的函数当函数名和不同的参数搭配时函数的含义不同int func(int x) { return x;}int func(int a, int b) { return a + b;}int func(const char* s) { re...原创 2018-05-24 17:22:14 · 216 阅读 · 0 评论 -
45-不同的继承方式
45-不同的继承方式【范例代码】有趣的尝试#include <iostream>#include <string>using namespace std;class Parent {};class Child_A : public Parent {};class Child_B : protected Parent {};class Child_...原创 2018-06-06 11:05:22 · 145 阅读 · 0 评论 -
39-逗号操作符的分析
39-逗号操作符的分析逗号操作符(,)可以构成逗号表达式:逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式中的前N-1个子表达式可以没有返回值逗号表达式按照从左向右的顺序计算每个表达式的值exp1, exp2, exp3, ..., expN【范例代码】逗号表达式的示例#include <iostream>#include <strin...原创 2018-05-17 14:16:29 · 93 阅读 · 0 评论 -
38-逻辑操作符的陷阱
38-逻辑操作符的陷阱潜规则逻辑运算符的原生语义:操作符只有两种值(true和false)逻辑表达式不用完全计算就能确定最终值最终结果只能是true或者false【范例代码】逻辑表达式#include <iostream>#include <string>using namespace std;int func(int i) { cout <<...原创 2018-05-17 11:38:32 · 90 阅读 · 0 评论 -
37-智能指针分析
37-智能指针分析永恒的话题内存泄漏(臭名昭著的Bug)动态申请堆空间,用完后不归还C++语言中没有垃圾回收的机制指针无法控制所指堆空间的生命周期【范例代码】内存泄漏#include <iostream>#include <string>using namespace std;class Test { int i;public: Test(int...原创 2018-05-17 11:01:44 · 94 阅读 · 0 评论 -
16-类的真正形态
类的真正形态类的关键字struct在C语言中已经有了自己的定义,必须继续兼容在C++中提供了新的关键字class用于类定义class和struct的用于是完全相同的【问题】class和struct有什么区别?在用struct定义类时,所有成员的默认访问级别为public在用class定义类时,所有成员的默认访问级别为private【范例代码】class的初探#include <stdio.h...原创 2018-04-10 17:06:25 · 84 阅读 · 0 评论 -
17-对象的构造(上)
对象的构造(上)对象的初始化从程序设计的角度,对象只是变量,因此:在栈上创建对象时,成员变量初始值为随机值在堆上创建对象时,成员变量初始值为随机值在静态存储区创建对象时,成员变量初始值为0值【范例代码】成员变量的初始值#include <stdio.h>class Test {private: int i; int j;public: int getI(...原创 2018-04-10 18:18:38 · 78 阅读 · 0 评论 -
18-对象的构造(中)
对象的构造(中)带有参数的构造函数:构造函数可以根据需要定义参数一个类中可以存在多个重载的构造函数构造函数的重载遵循C++重载的规则class Test {public: Test(int v) { // use v to initialize member }}对象定义和对象声明不同:对象定义:申请对象的空间并调用构造函数对象声明:告诉编译器存在这样一个对象Test t; //...原创 2018-04-11 15:03:47 · 124 阅读 · 0 评论 -
19-对象的构造(下)
对象的构造(下)两个特殊的构造函数:无参构造函数:没有参数的构造函数;当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空拷贝构造函数:参数为const class_name&的构造函数;当类种没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制【温馨提示】如果类中提供了拷贝构造函数,则编译器不会提供无参构造函数。【范例代码】特殊的构造函...原创 2018-04-11 16:11:27 · 85 阅读 · 0 评论 -
20-初始化列表的使用
初始化列表的使用类成员的初始化C++中提供了初始化列表对成员变量进行初始化。语法规则:ClassName::ClassName() : m1(v1),m2(v1,v2),m3(v3) { //some other initialize operation}成员的初始化顺序与成员的声明顺序相同成员的初始化顺序与初始化列表中的位置无关初始化列表先于构造函数的函数体执行【范例代码】初始化列表的使用#...原创 2018-04-11 16:58:14 · 88 阅读 · 0 评论 -
21-对象的构造顺序
对象的构造顺序1、对于局部对象:当程序执行流到达对象的定义语句时进行构造。【范例代码】局部对象的构造顺序#include <stdio.h>class Test {private: int mi;public: Test(int i) { mi = i; printf("Test(int i): %d\n", mi); }...原创 2018-04-11 18:13:18 · 77 阅读 · 0 评论 -
22-对象的销毁
对象的销毁一般而言,需要销毁的对象都应该做清理。析构函数C++的类中可以定义一个特殊的清理函数这个特殊的清理函数叫做析构函数析构函数的功能与构造函数相反定义:~ClassName()析构函数没有参数也没有返回值类型声明析构函数在对象销毁时自动被调用【范例代码】析构函数使用初探#include <stdio.h>class Test { int mi;public: ...原创 2018-04-12 18:26:27 · 113 阅读 · 0 评论 -
28-友元的尴尬能力
28-友元的尴尬能力友元的概念友元的C++中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系是单项的,不能传递友元的用法在类中以friend关键字声明友元类的友元可以是其他类或者具体函数友元不是类的一部分友元不受类中访问级别的限制友元可以直接访问具体类的所有成员友元的语法在类中用friend关键字对函数或类进行声明class Point { double x; double y; ...原创 2018-04-22 15:16:42 · 136 阅读 · 0 评论 -
23-神秘的临时对象
神秘的临时对象构造函数是一个特殊的函数:是否可以直接调用?是否可以在构造函数中调用构造函数?直接调用构造函数的行为是什么?【范例代码】有趣的问题#include <stdio.h>class Test { int mi;public: Test(int i) { mi = i; } Test() { Test(0);...原创 2018-04-13 16:05:50 · 93 阅读 · 0 评论 -
25-类的静态成员变量
25-类的静态成员变量成员变量通过对象名能够访问public成员变量每个对象的成员变量都是专属的成员变量不能再对象之间共享静态成员变量C++中可以定义静态成员变量:静态成员变量属于整个类所有静态成员变量的生命期不依赖于任何对象可以通过类名直接访问公有静态成员变量所有对象共享类的静态成员变量可以通过对象名访问公有静态成员变量静态成员变量的特性:在定义时直接通过static关键字修饰静态成员变量需要在...原创 2018-04-20 16:37:28 · 180 阅读 · 0 评论 -
29-类中的函数重载
29-类中的函数重载函数重载函数重载的本质为相互独立的不同函数C++中通过函数名和函数参数确定函数调用无法直接通过函数名得到重载函数的入口地址函数重载必然发生在同一个作用域中类中的重载类中的成员函数可以进行重载:构造函数的重载普通成员函数的重载静态成员函数的重载万变不离其宗:重载函数的本质为多个不同的函数函数名和参数列表是唯一的标识函数重载必须发生在同一个作用域中【范例代码】类与重载全面分析#in...原创 2018-04-24 11:03:13 · 68 阅读 · 0 评论 -
30-操作符重载的概念
30-操作符重载的概念C++中的重载能够扩展操作符的功能操作符的重载以函数的方式进行本质:用特殊形式的函数扩展操作符的功能通过operator关键字可以定义特殊的函数operator的本质是通过函数重载操作符语法:Type operator Sign(const Type& p1, const Type& p2) { Type ret; return ret;}// Sig...原创 2018-04-24 13:51:45 · 91 阅读 · 0 评论 -
26-类的静态成员函数
26-类的静态成员函数类的成员函数在C++中可以定义静态成员函数:静态成员函数是类中特殊的成员函数静态成员函数属于整个类所有可以通过类名直接访问公有静态成员函数可以通过对象名访问公有静态成员函数静态成员函数的定义直接通过static关键字修饰成员函数class Test {public: static void Func1() {} static int Func2();};int Te...原创 2018-04-20 17:28:07 · 129 阅读 · 0 评论 -
27-二阶构造模式
27-二阶构造模式关于构造函数类的构造函数用于对象的初始化构造函数与类同名并且没有返回值构造函数在对象定义时自动被调用【范例代码】异常的构造函数#include <stdio.h>class Test { int mi; int mj; bool mStatus;public: Test(int i, int j) : mStatus(false)...原创 2018-04-20 18:05:45 · 108 阅读 · 0 评论 -
11-新型的类型转换
11-新型的类型转换强制类型转换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 = (Point*)v;【范...原创 2018-05-03 09:48:23 · 94 阅读 · 0 评论 -
46-继承中的构造与析构
46-继承中的构造与析构【问题】如何初始化父类成员?父类构造函数和子类构造函数有什么关系?子类对象的构造子类中可以定义构造函数必须对继承而来的成员进行初始化:直接通过初始化列表或者赋值的方式进行初始化调用父类构造函数进行初始化父类构造函数在子类中调用方式:默认调用:适用于无参构造函数和使用默认参数的构造函数显示调用:(1)通过初始化列表进行调用(2)适用于所有父类构造函数父类构造函数的调用:cla...原创 2018-06-06 15:55:21 · 151 阅读 · 0 评论