简介
- 主要记录一些容易忽略和忘记的知识点,原因是有些知识点刚看过之后觉的懂了,但是过段时间可能又忘记了的情况。
记录
- 基本数据类型
Fundamental types
Windows Data Types.aspx) - 指针类型和引用类型
- 构造函数初始化数据成员的方式,除了在函数体中使用复制和赋值等方法外,还可以使用初始化表,初始化表位于参数表和函数体之间,以:开头,由一个或多个初始化项构成,多个初始化项以逗号相分隔,一般的形式为:
:数据成员1(表达式1),。。。,数据成员n(表达式n)
常值数据成员、对象成员和从基类继承来的数据成员等特殊成员的初始化,必须采用初始化表
(不得不说语法真是复杂,还是必须。。) - 函数指针和回调函数
参考刚开始还不好理解,其实还挺有意思的,就是你可以函数指针变量可以作为某个函数的参数来使用,那么这个函数 - 内联函数
可以这么理解,调用函数的时候,系统需要做一系列的辅助工作(例如保护现场,为函数所用变量分配内存,实参赋值给形参等),然后转去执行被调用函数的函数体,当执行完成后,还要做一系列的辅助工作,再接着执行函数调用之后的语句。这个过程时候时间开销的,为了节省时间,c++允许定义内联函数,就是函数在编译的时候会把你的调用处的函数替换成函数体。虽然代码存储空间可能变大了,但是整个程序的执行时间变小了。
此外,在类体内定义的成员函数默认为内联的,而要在类体外定义内联的成员函数,则需要用关键字inline进行声明。 - 函数重载
函数重载是指多个函数使用相同的函数名。函数重载是多态性的体现,即用同一个函数名实现多种函数调用。函数重载一般是函数的参数个数或者参数类型不同,这个时候,编译器会根据这个差别来进行差别性编译。 - 虚函数和纯虚函数
虚函数其实就是虚拟函数的意思,virtual function,感觉翻译成虚拟函数就挺好的,不知道为啥翻译到国内就是叫虚函数,感觉怪怪的。这个虚拟函数和函数重载的概念有点儿相似,在派生类中可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。(感觉像是java里面的接口),这也是多态性的体现(注意这里是运行时的多态性,不同于函数重载编译时的多态性)。c++接口(抽象类) - std standard的缩写,我们在使用c++的标准库的标识符的时候需要使用using namespace std;使用了命名空间std的有 cstdio cmath csring string等。
- 今天学习STL,才真正意识到什么是容器(用来放东西的)。也觉得以前都没有怎么去理解容器,每一种语言都有自己的容器,像python中有list、dict、tuple等容器,java中有arraylist、hashset、hashmap等容器,可以说容器是复杂的数据结构(相对于简单的数据结构int,float这种)。c++ 中标准STL序列容器:vector、string、deque和list。
标准STL关联容器:set、multiset、map和multimap。每种容器类型都定义了自己的迭代器类型,如vector
vector::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector 定义的iterator类型。
list::iterator iter1;这条语句定义了一个名为iter1的变量,它的数据类型是由list 定义的iterator类型。
wiki对容器的介绍) - C++ 的可移植性和跨平台开发
https://msdn.microsoft.com/zh-cn/library/dn707591.aspx
https://program-think.blogspot.com/2009/01/cxx-cross-platform-develop-0-overview.html - google c++ 编程规范
http://google.github.io/styleguide/cppguide.html 预编译
1
2
3
4预编译又称为预处理,是做些代码文本的替换工作。
处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等
就是为编译做的预备工作的阶段
主要处理#开始的预编译指令不同的编译器以及不同的语言标准
gcc wiki
gnu c compiler,因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。- 使用g++ 编译的时候,可以使用c++的标准库,使用gcc命令编译的时候,可以使用c的标准库。stackoverflow link
- 还有一个编译器不得不说,那就是clang,他一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。他的出现目的是替代GCC,是在苹果公司的赞助支持下开发的。
测试证明Clang编译Objective-C代码时速度为GCC的3倍[4],还能针对用户发生的编译错误准确地给出建议. - 类类型与结构体类型相似,结构体类型也可以有函数成员,主要区别在于,类类型的默认访问权限是private,结构体类型的缺省访问权限是public。类的数据成员和函数成员分别描述该类实体的属性和行为。即这个实体有什么属性,它有什么样的行为。对象也是一种变量,是一种类类型的变量。对于已声明的类,可以使用它来定义变量。在建立对象时,只为对象分配用于保存数据成员的内存空间,而类中定义的成员函数的代码被放在计算机内存的一个公共区中,并供该类的所有对象共享,这是c++实现对象的一种方法。逻辑上,仍将每一个对象理解为由独立的数据成员和各自的成员函数组成。
- 结构体指针 struct stu *pstu = &stu1;
- ::在c++中是作用域符号。
- c和c++ 不同的标准
可见,c++的标准有c++98,c++11,c++14,c++17,c++后面对应的数字是年份的意思
c语言的标准有c90,c99,以及c11,可见最新的c标准是c11.
关于他们之前的差异。
关于c11和c99的区别)
关于c++各个版本之前的区别
高速上手 C++ 11/14
vc6.0与标准C++
ISO cpp - c++ 第三方库
c++准标准库boost
google 的c++基础库 abseil - 多线程c程序
https://msdn.microsoft.com/zh-cn/library/esszf9hw.aspx
http://zh.highscore.de/cpp/boost/multithreading.html - c语言的json操作库
https://github.com/akheron/jansson
使用boost操作json - c/c++ 内存泄露及检测
http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html - const关键字的使用方法
http://www.cnblogs.com/jiabei521/p/3335676.html 关于msvc的介绍
https://www.wikiwand.com/zh-hans/Microsoft_Visual_C%2B%2B1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18MSVC++ 14.1 _MSC_VER == 1911 (Visual Studio 2017)
MSVC++ 14.1 _MSC_VER == 1910 (Visual Studio 2017)
MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)
MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)
MSVC++ 9.0 _MSC_FULL_VER == 150030729 (Visual Studio 2008, SP1)
MSVC++ 9.0 _MSC_VER == 1500 (Visual Studio 2008)
MSVC++ 8.0 _MSC_VER == 1400 (Visual Studio 2005)
MSVC++ 7.1 _MSC_VER == 1310 (Visual Studio 2003)
MSVC++ 7.0 _MSC_VER == 1300
MSVC++ 6.0 _MSC_VER == 1200
MSVC++ 5.0 _MSC_VER == 1100
打印版本 msvc
#ifdef _MSC_VER
cout << _MSC_VER << endl;
#endif- 检测变量类型的方法 typeinfo 头
http://www.cplusplus.com/forum/general/21246/小结
- 相对于其它脚本语言python、php啥的,c++的语法稍有些复杂,尤其是在windows下进行c++开发的时候,一开始一大堆的宏定义就小白们搞懵了。如果要写c++入门建议还是学linux下的c++,等学差不多了,再切换windows相对来说就容易一些了。
- c++较写脚本语言开发感觉还是会慢一点,脚本语言不用编译,c++每次修改一点儿,都要重新编译和链接,而且工程越大,时间就越长。