C/C++
c/c++编程语言
hs-caoyc
乌龟和兔子的故事...
展开
-
ISO/ANSI C
ISO:国际标准委员会ANSI:美国国家标准协会c语言标准:C89,C99,C11等经常看到一些书上写 ANSI C, ISO C,傻傻分不清楚,其实它们都是C语言发展过程中的版本命名。请看下表:【C89 (ANSI C)】:1989 年, C 语言的标准草案被 ANSI 正式通过成为美国国家标准,被称为 C89 标准。【C90 (ISO C)】:1990 年,在 ISO/IEC JTC1/SC22/WG14 (ISO/IEC 联合技术第 I 委员会第 22 分委员会第 14 工作组) 的努力下原创 2020-11-25 16:22:15 · 366 阅读 · 0 评论 -
泛型编程——算法
STL包含很多处理容器的非成员函数,比如:sort()、 copy()、 find()、 random_shuffle()、 set_union、 set_intersection()、 set_difference()和transform()。 对于算法函数设计,有两个主要的通用部分。首先,它们都使用模板来提供泛型;其次它们都使用迭代器来提供访问容器中数据的通用表示。算法组STL将算法库分为4组:• 非修改式序列操作;• 修改式序列操作;• 排序和相关操作;• 通用数字运算;前3组在原创 2020-05-31 22:07:59 · 172 阅读 · 0 评论 -
泛型编程——函数对象
很多STL算法都使用函数对象——也叫函数符。函数符是可以以函数方式与()结合使用的对象。这包括函数名,指向函数的指针和重载了()运算符的类对象。class Linear{ double slope; double y0;public: Linear(double sl_ = 2, double y_ = 0) : slope(sl_), y0(y_) {} double operator()(double x){return y0 + slope * x;}}重载的()运算符将原创 2020-05-31 19:12:37 · 194 阅读 · 0 评论 -
泛型编程——容器种类
•原创 2020-05-31 18:22:09 · 336 阅读 · 0 评论 -
泛型编程——迭代器
STL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码,但它们的理念决然不同。 泛型编程旨在编写独立于数据类型的代码。在C++中,完成通用程序的工具是模板。模板使得能够按泛型定义函数或类,而STL通过通用算法更近了一步。模板让这一切成为可能,但必须对元素进行仔细的设计。为何使用迭代器 理解迭代器是理解STL的关键所在。模板使得算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类。因此,它们都是STL通用方法的重要组成部分。原创 2020-05-30 22:16:03 · 466 阅读 · 0 评论 -
标准模板库
STL提供了一组表示容器、迭代器、函数对象和算法的模板。 容器是一个与数组数类似的单元。可以存储若干个值。STL容器是同质的,即存储的值的类型相同; 算法是完成特定任务(如对数组进行排序或在链表中查找特定值)的方法; 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针; 函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。 STL使得能够构造各种容器(包括数组、队列和链表)和执行各种操作(包括搜索、排序和随机排列)。...原创 2020-05-30 17:29:13 · 166 阅读 · 0 评论 -
智能指针模板类
智能指针是行为类似于指针的类对象,但这种对象还有其他功能。void remodel(std::string & str){ std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; delete ps; return;}当出现异常时,delete将不被执行,将导致内存泄漏。 当函数终止时(不管是正常终止,还是异常终止),本地变量都将从栈内原创 2020-05-29 22:23:39 · 293 阅读 · 0 评论 -
string类
c语言在string.h中提供了一系列的字符串函数,c++提供了string类对字符串进行处理,它也能处理c风格的字符串。string实际上是模板具体化basic_string的一个typedef,同时省略了与内存管理的相关参数。string类的构造函数构造函数描述string(const char * s)将string对象初始化为s指向的NBTS(以空字符结束的字符串)string(size_type n, char c)创建一个包含n个元素的string对象,其中每个原创 2020-05-29 19:40:06 · 162 阅读 · 0 评论 -
类型转换运算符
C++的创始人认为C语言的类型转换太过松散,所以在C++中添加了4个类型转换运算符,使转换过程更规范:• dynamic_cast;用于在类层次结构中进行向上转换dynamic_cast (expression)• const_cast;/只执行一种用途的转换,改变值为const或volatile,type-name和expression类型必须相同。const_cast (expression)• static_cast;static_cast (expression)仅当ty原创 2020-05-23 20:05:04 · 234 阅读 · 0 评论 -
RTTI
RTTI是运行阶段类型识别(Runtime Type Identification)的简称。RTTI旨在为程序运行阶段确定对象的类型提供一种标准方式。RTTI的用途 假设有一个类层次结构,其中的类都是从同一个基类派生而来,则可以让基类的指针指向其中任何一个类的对象。这样便可以调用这样的函数:在处理一些信息后,选择一个类,并创建这种类型的对象,然后返回它的地址,而该地址可以被赋给基类指针。但是如何知道指针指向的是哪种对象呢? 在这个问题之前,先要考虑为何要知道类型。1.可能希望调用类方法的正确原创 2020-05-23 19:32:48 · 316 阅读 · 0 评论 -
异常
程序有时会遇到运行阶段错误,导致程序无法正常的运行下去,这就是异常。异常是相对较新的C++功能,有些老式编译器可能没有实现,另外,有些编译器默认关闭这种特性,需要使用编译器选项来启用它。异常机制对异常的处理有3个组成部分:1.引发异常;2.使用处理程序捕获异常;3.使用try块;int main(){ double x, y, z; std::cout << "Enter two numbers: "; while (std::cin >>原创 2020-05-23 09:54:29 · 204 阅读 · 0 评论 -
嵌套类
在C++中,可以将类声明放在另一个类中,在另一个类中声明的类被称为嵌套类,它通过提供新的类型类作用域来避免名称混乱。包含类的成员函数可以创建和使用被嵌套类的对象;而仅当声明位于公有部分,才能在包含类的外面使用嵌套类,而且必须使用作用域解析运算符。 对类进行嵌套和包含并不同,包含意味着将类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义一种类型,该类型仅在包含嵌套类声明的类中有效。class Queue{ enum {Q_SIZE = 10};private: str原创 2020-05-22 20:20:53 · 162 阅读 · 0 评论 -
友元类
类并非只能拥有友元函数,也可以将类作为友元。这样友元类的所有方法都可以访问原始类的私有成员和保护成员。另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元。友元声明可以位于公有、私有或保护部分,其所在的位置无关紧要。下面给一个友元类的例子:class Tv{ int state; int volume; int maxchannel; int channel; int mode; int input;public: fri原创 2020-05-21 22:57:14 · 610 阅读 · 0 评论 -
JSON语法
前段时间使用VS CODE编译调试了C++程序,发现VSC很多配置选项都能以.JSON的文件格式来进行选项配置。今天来特意了解一下JOSN。JSON简介JSON: JavaScript Object Notation(JavaScript 对象表示法)JSON 是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析。JSON 是一种轻量级的文本数据交换格式而非编程语言,其语法只支持字符串,数值,布尔值及null以及在此基础上的对象和数组。JSON 使用 JavaS原创 2020-05-21 20:45:24 · 254 阅读 · 0 评论 -
C++代码重用
c++提供的代码重用方法:1.包含;2.继承;3.类模板;原创 2020-05-21 20:31:00 · 1108 阅读 · 0 评论 -
类继承
C++提供了比修改代码更好的方法来扩展和修改类。这种方法叫继承,它能够从已有的类派生出新的类,而派生类继承了原有类(称为基类)的特征,包括方法。当派生类继承了基类之后需要在派生类中添加:1.派生类需要自己的构造函数;2.派生类可以根据需要添加额外的数据成员和成员函数。派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问。在创建派生类对象时,程序首先调用基类构造函数,然后再调用派生类构造函数。基类构造函数负责初始化继承的数据成员;派生类构造函数主要用于初始化新增的数据成员。派生类对象过期时,原创 2020-05-15 20:44:50 · 309 阅读 · 2 评论 -
成员初始化列表
如果类中有const成员变量,可以对它初始化但是不能赋值。下面的代码是无法正常运行的Queue:Queue(int qs){ front = rear = NULL; items = 0; qsize = qs;} 从概念上来说,调用构造函数时,对象将在括号中的代码执行之前被创建。因此,调用Queue(int qs)构造函数将导致程序首先给4个成员变量分配内存。然后,程序流程进入到括号中,使用常规的赋值方式将值存储到内存中。因此,对于const数据成员,必须在执行到构造函数体之前,即创原创 2020-05-11 21:10:08 · 551 阅读 · 0 评论 -
嵌套结构和类
在类中嵌套结构或类声明class Queue{ enum {Q_SIZE = 10};private: struct Node {Item item; struct Node *next;}; Node * front; Node * rear; int items; const int qsize; } 通过将Node声明放在Queue类中,可以使其作用域为整个类。也就是说Node是这样一个类型:可以使用它来声明类成员,也可以将它作为类方原创 2020-05-11 20:50:56 · 393 阅读 · 0 评论 -
构造函数使用new的类
如果类使用new运算符来分配类成员指向的内存,在设计时应采取一些预防措施(应牢记这些规则,这是因为编译器并不知道这些规则,因此无法发现错误)• 对于指向的内存是由new分配的所有类成员,都应在类的析构函数中对其使用delete,该运算符将释放分配的内存;如果析构函数通过对指针类成员使用delete来释放内存,则每个构造函数都应当使用new来初始化指针,或将它设置为空指针;构造函数中要么使用new[],要么使用new,而不能混用。如果构造函数使用的是new[],则析构函数应使用delete[];如果原创 2020-05-11 20:37:22 · 530 阅读 · 0 评论 -
C++知识结构图
转载自:https://blog.csdn.net/Payshent/article/details/55254574 ...转载 2020-05-11 15:40:24 · 186 阅读 · 0 评论 -
使用VS Code 编译调试C++程序
软件及插件安装1.先安装vs code;2.安装必要的插件;在vs code扩展中直接搜索,点击安装即可。3.安装C/C++编译工具与CMake工具,这两个工具需要去网上下载。国外的网站下载挺慢,这里分享一个百度网盘连接:链接:https://pan.baidu.com/s/1oiMxAp-6_dOGp3a0Q1tNzQ提取码:gn17 mingw是windows下的一个c/c++编译器,软件安装好之后,需要在电脑上添加环境变量:我的电脑右键->属性->高级系统设置->环境变原创 2020-05-10 13:50:02 · 692 阅读 · 0 评论 -
类中的特殊成员函数
C++自动提供了下面这些成员函数:• 默认构造函数,如果没有定义构造函数;• 默认析构函数,如果没有定义;• 复制构造函数,如果没有定义; 新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。该函数逐个复制非静态成员(成员复制也称为浅复制),复制的是成员的值。也可以根据自己的需要显式的定义复制构造函数来完成自己所需的功能。 如果类中包含使用new初始化的指针成员,应...原创 2020-05-07 22:17:05 · 623 阅读 · 0 评论 -
C++内存模型和动态内存分配
C++使用三种(在C++11中是4种)不同的方案来存储数据,这些方案的区别就在于数据保留在内存中的时间。• 自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,它们使用的内存被释放。C++有两种存储持续性为自动的变量。• 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续...原创 2020-05-07 21:32:54 · 204 阅读 · 0 评论 -
类的自动转换和强制类型转换
类的自动转换 可以将类定义成与基本类型或另一个类相关,使得从一种类型转换为另一种类型是有意义的。我们可以指示c++如何自动转换或者通过强制转换来完成。自动转换实际是通过只接受一个参数的构造函数来实现的。如果构造函数有两个参数,只要其中一个参数提供了默认值,那么它也可用于转换。class Stonewt{ enum {Lbs_per_stn = 14}; int stone; do...原创 2020-05-07 20:54:26 · 156 阅读 · 0 评论 -
友元
通常C++访问类私有部分的方法是类的公有方法,有时候不适合特定的编程问题。C++提供了另外一种形式的访问权限:友元,友元有3种:• 友元函数;• 友元类;• 友元成员函数;通过让函数成为类的友元,可以赋予该函数与类的成员函数一样的访问权限。需要友元的情况: class Time;是一个类,为该类重载了*运算符,Time & Time::operator*(double b...原创 2020-05-05 17:59:39 · 116 阅读 · 0 评论 -
运算符重载
运算符重载是一种形式的C++多态。 要重载运算符,需要使用被称为运算符函数的特殊函数形式。运算符函数的格式如下:operatorop(argument-list)op必须是有效的C++运算符,不能虚构一个新的符号。例如operator+()重载+运算符。class Time{ int hours; int minutes;};Time total;Time coding...原创 2020-05-04 21:31:48 · 155 阅读 · 0 评论 -
对象和类
对象和类 类是用户定义的类型,对象是类的实例。OOP特性:• 抽象• 封装和数据隐藏• 多态• 继承• 代码的可重用性 在C++中,用户定义类型指的是实现抽象接口的类设计。指定基本类型完成了三项工作:• 决定数据类型需要的内存数量;• 决定如何解释内存中的位(比如long和float在内存中占用的位数相同,但是在转换为数值时的方法不同);• 决定可使用数据对象执行的操作...原创 2020-05-04 20:13:12 · 135 阅读 · 0 评论 -
单独编译
单独编译一般来说我们编写程序的时候是将不同功能的代码放在不同的文件中,c/c++编译器在编译的时候都是对每个文件进行单独编译的,然后进行链接。如果只修改了一个文件,编译器在重新编译的时候是只编译修改的文件,这样做的好处是节省时间,便于编译器进行管理。例如UNIX和linux系统都有make程序,它可以跟踪程序依赖的文件和这些文件最后的修改时间。...原创 2020-05-01 19:18:39 · 741 阅读 · 0 评论