c和c++易混淆点笔记

简介

  • 主要记录一些容易忽略和忘记的知识点,原因是有些知识点刚看过之后觉的懂了,但是过段时间可能又忘记了的情况。

    记录

  • 基本数据类型
    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%2B

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    MSVC++ 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
  • VS的调试技巧
    https://blogs.msdn.microsoft.com/c/2016/09/19/visual-studio-c%E8%B0%83%E8%AF%95%E6%8A%80%E5%B7%A7%E5%92%8C%E7%AA%8D%E9%97%A8/

  • 检测变量类型的方法 typeinfo 头
    http://www.cplusplus.com/forum/general/21246/

    小结

  • 相对于其它脚本语言python、php啥的,c++的语法稍有些复杂,尤其是在windows下进行c++开发的时候,一开始一大堆的宏定义就小白们搞懵了。如果要写c++入门建议还是学linux下的c++,等学差不多了,再切换windows相对来说就容易一些了。
  • c++较写脚本语言开发感觉还是会慢一点,脚本语言不用编译,c++每次修改一点儿,都要重新编译和链接,而且工程越大,时间就越长。