• C++ primer 简读


    • C++创始人寄语:轻松使用这种语言,不要觉得必须使用所有的特性,不要在第一次学习时就试图使用所有特性。
    • 头文件引用,如果是标准库引用用尖括号<>,如果是不属于标准库的头文件引用用双引号""
    • 明白什么是流就知道了流的插入运算符(插入到工作台)<< cout: 输出从后面的名流向标准输出cout插入来显示.
    • cin,cout,endl都是std里的标准操作。(end line)
    • { } :表示实现, () : 表示声明。
    • 在cpp中调用类的方法也叫调用类的成员函数(类的一个方法就是类的一个成员),点运算符表示是成员,当用点运算符调用成员时还需要调用运算符(),里面放置实参也可能为空。如sales.ISBN()
    • 条件语句用括号()括起来,循环体用花括号括起来{ }
    • endl的两个功能: 1结束当前行,2强制刷新缓冲到iostream流
    • <<插入运算符,>>输入运算符
    • &: 取地址符, *指针。 如 * p = & val,将p定义为指向val变量的指针,或者说p存放变量val的地址(这个地址就是这个对象本身)。**p:指向指针的指针
    • 定义常量:const int val = 20 //定义常量val。默认const常量仅在文件内有效,若需在文件间有效,需要加前缀extern
    • 迭代器解引用:(*iter), *解引用后调用方法 (*iter).empty( ), 第一个括号是解引用必须的 ,第二个括号调用成员函数必须的。
    • 箭头运算符 —>:将解引用和成员访问结合起来。iter —> empty() 等价于 (*iter).empty()
    • 数组的特性:在很多用到数组名字的地方,编译器都会自动将数组替换为一个指向数组首元素的指针。如 string *p = nums == p = & nums[0]
    • 指针也是迭代器。*p指的是p是一个指针。可以通过给出p的下限和上限来打印所有指针。for *e = arr(10) , for(int *p = arr ; p ! = e; ++b ) cout << *p << endl; //输出arr的所有元素。
    • 标准库给出了两个比较不会犯错的函数,begin()和end()。int *beg = begin(arr) //指向arr首元素的指针。int *last = end(arr) //指向尾元素的下一位置
    • 如果传入print函数的是一个数组,那么实参会自动的转换成指向该数组的第一个元素的指针。
    • while (beg != end) cout << *beg++ << endl; 循环内使用解引用运算符和后置递减运算符,输出当前元素并在数组内将beg向前移动一个元素。解引用操作符:*,返回指针p所指地址保存的值。这里涉及到前置++和后置++,如 j= *i++ 前置++后i本身+1且被赋值对象j也产生效果。而后置++相当于,被赋值对象j不+1,仅仅是i本身++; 等价于 j = *i,++i
    • 函数重载:函数名相同,但是形参部分形式不一样。一般而言最好只重载那些确实很相似的操作,给函数起不同的名字能使得程序更易理解。
    • typedef 定义别名,typedef si = sale_item (等价于typedef si sale_item) 将sale_item起一个别名si
    • consexper函数:能用于常量表达式的函数。约定:1.所有返回类型及形参类型都是字面值类型 2.函数体中必须有且只有一条return语句。
    • 针对封装的访问说明符:public说明符之后的成员(方法)在整个程序内可被访问,public成员定义类的接口。 private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问。private部分封装了(隐藏了)类的实现细节。类中的非公有成员如何被其他类或函数访问呢??那就是使其他类或函数称为此类的友元。
    • c++标准库:io库,顺序容器,泛型算法,关联容器( map(保存的关键字和值,即key-val), set(只保存一个关键字,即只有key)),动态内存。
    • 何为泛型算法??顺序容器只定义了很少的操作,如添加删除元素/访问首尾元素/确定元素是否为空/获得指向首元素或尾元素之后位置啊的指针。用户可能还需要一些其他有用的操作。如查找某元素/替换或删除一个特定值/重排元素等。标准库并没有给每个容器定都定义方法里实现这些操作,而是定义了一组通用的算法即泛型算法(可以用于不同类型的元素及不同类型的容器类型),这些算法实现了一些经典算法的公共接口。大多数算法都定义在头文件algorithm中,还有一些在头文件numeric中。一般情况下这些算法并不直接操作容器,而是遍历有两个迭代器指定的元素范围
    • C++中,堆内存通过new表达式分配,通过delete表达式释放,还定义了一个allocator类来分配动态内存块。动态内存:分配动态内存的程序同时要对其内存释放负责,新的标注库定义了智能指针shared_ptr, unique_ptr, weak_ptr来进行动态内存管理,尽可能使用智能指针来管理。
    • 断点调试:几个功能:1加断点     2运行到下一行        3 进入函数体(F9,F10,F11)
    • 控制台要求主函数是main(),窗口要求主函数是winmain()
    • c++执行过程:首先对cpp源文件预处理(头文件完成的)(变成.ii文件),其次将.ii文件进行编译变成.S文件,机器实际能执行的是汇编,将.s文件汇编成.o文件(目标文件,二进制文件)这才算是初级的目标文件,.o文件再与C++函数库进行链接生成.exe可执行文件。而平常我们只是敲一行代码就完成这些底层了:在项目所在文件目录下,g++ -o helloworld.ii -Ehelloworld.cpp
    • 计算机程序操纵的数据最终都是在内存中的,内存才是程序真正起作用的地方,而这个内存又分主存(在cpu旁边,超快)和随机访问存储器(RAM,也就是我们说的内存条)两种。
    • c++中用 换行,用 一次四个空格。

    自动存储:局部变量,函数内定义的一半变量,函数开始运行,变量加入栈中,函数运行完自动释放。
    静态存储:全局变量或是static声明的变量。程序运行的整个周期存在.
    自由存储:new和delete创建的,由程序员自己操纵的内存,也称堆,这个内存是独立于自动存储内存和静态存储内存外的。delete可以跨函数释放。

    compile:编译当前打开文件中的代码
    build/make:编译项目中所有文件,增量编译
    build all:全部重新编译
    debug:步进执行

    一般各源文件的全局变量的访问是贯通整个项目文件的,但是当给某个源文件的全局变量加static,变为静态全局变量,那么就将其访问域限定在此源文件中,其他源文件不能调用。因此按访问权限来讲:全局变量>静态全局变量>局部变量。
    当static作用于局部变量时,???
    extern:声明引用的是在其他地方定义的变量。

    头文件中长包含的内容:

    • 函数原型
    • #define或const定义的符号常量
    • 结构声明_struct
    • 类声明
    • 模板声明
    • 内联函数:内联函数可以允许同一个程序中包含同一个函数的两个定义。(程序——整个项目文件)

    c++创建指针时将分配用来存储地址(这个指针)的内存,但并不会分配这个指针存放的数据的内存。
    cin.getline(name,num)  读取一整行到name数组中,name数组不超i过num-1个字符。
    空白符:空格,制表符,换行符。
    任何两个由空白符分割的字符串拼接输出时都会直接拼接在一起,不会再有空格。

    enum name{};name就成了枚举类型,类似enum用法类似typedef

    sizeof():是变量的字节长度。
    类是对象的描述和格式
    对象是类的实体,好比类是人,对象是小明。
    一行代码中不可分割的最小语义元素成称为token,如int,如main。

    c++代码规范:
    一:每条语句一行
    二:函数后的两个花括号各占一行
    三:花括号内函数实体进行缩进
    四:函数名后的第一个”(“两边不含空格

  • 相关阅读:
    Git 基本操作
    Git 基础
    MarkDown教程
    Python常用函数
    Python生成器
    Python列表生成式
    Python迭代
    Python切片
    Python函数
    Python不可变对象
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725268.html
Copyright © 2020-2023  润新知