写在开篇的话:编程语言是规则的集合,语法只是这些规则的一部分,C/C++是允许扩展的,vc++的部分规则是微软扩展的,并不具有移植性;编程就是利用规则实现一个可行的方案;语言的不同在于设计的思想不同(前提是语言真的实现了该种设计思想),不同的想法,不同的设计,导致了不同的语言适用于不同的应用环境。
书到用时方恨少
输入---程序-->输出

  1. main函数,main函数是程序的入口函数,有且仅有一个,操作系统从启动代码(C RUNTIME)呼叫该函数,从而开始程序的执行。main函数可以返回一个值给操作系统,这个值可以在命令行通过“echo %errorlevel%”显示,这个值也可以用作bat文件中的判断条件。(本文基于windows操作系统,所使用的一些命令适用于windows平台)
  2. 一个程序从0到1分为几步:1)使用文本编辑器编写源代码2)通过预处理器替换头文件内容,替换宏等3)编译器编译源代码(.obj),这一步判断语法错误4)链接器链接对应的函数(二进制代码),包括标准库函数,并生成对应的可执行文件。如果使用IDE(如visual studio等),则所有的部分都集成在一个开发环境里面。一般会遇到的错误有,或者需要注意的点:1)头文件找不到,需要注意是否添加了头文件的包含路径。2)语法错误,这个明显,要注意的是API的使用规则。3)无法识别的外部符号,记得要添加lib。4)如果指定了预编译头文件,注意每个cpp文件都应该包含该预编译头文件。
  3. IO,IO并不是C++语法的一部分,IO是编译器实现厂商提供的标准库的一部分功能。C++规定了IO的函数名。但说到底,要清楚,IO是标准库函数的一部分。C++定义了4个标准的输入输出对象,cin,cout,cerr,clog;一般情况下,这些对象与程序窗口关联,但也可以重定向这些对象与文件对应起来。流的概念,流出去了就没有了,所以如果读取流,那么被读取的数据会从流中删除。
    4.左右结合特性,想想赋值操作符,右结合特性,肯定是先把右边的数值算完再赋给左边的变量。左右结合特性有其合理性。
    5.初始化,int i = 0; //赋值还是初始化?初始化,调用copy构造函数。int i(0);
    6.if语句怎么判断,非0就是真,只有0为假,if的括号类可以是表达式,关于流的判断,如果if的条件是流,判断流的failbit/badbit是否被设置。(eofbit属于正常)ios::goodbit/eofbit/failbit/badbit - 0/1/2/4.
    iostate value
    (member constants) indicates functions to check state flags
    good() eof() fail() bad() rdstate()
    goodbit No errors (zero value iostate) true false false false goodbit
    eofbit End-of-File reached on input operation false true false false eofbit
    failbit Logical error on i/o operation false false true false failbit
    badbit Read/writing error on i/o operation false false true true badbit

7.关于作用范围和生命周期:C++变量的作用范围分为这几种,全局作用域,局部作用域(函数或者代码块),语句作用域(for),(*静态作用域)。不同的作用域是允许覆盖的,也就是说,在不同的域可以定义相同名字的变量。小的作用域会屏蔽大的作用域的变量。类的作用域,类的非静态成员属于对象,必须通过对象来引用,静态成员属于类,通过类::直接引用。全局作用域的变量在程序结束时被释放,局部作用域在作用域结束后被释放掉,语句作用域在语句结束后释放掉。函数中定义静态变量,该变量存储在静态变量存储区域,程序结束时被释放。全局变量如果声明为static,则本文件可见。
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

  1. 基本上所有的语言都要提供下列特征:
    • 内置数据类型,如整型、字符型等。算术类型:bool, char, wchar_t(字符类型), short, int, long, (long long?)除bool外这些类型是由符号的,定义无符号数,前面要加unsigned. unsigned int可以缺省写为unsigned。float,double, long double.
    • 表达式和语句:表达式和语句用于操纵上述类型的值。
    • 变量:程序员可以使用变量对所用的对象命名。
    • 控制结构:如 if 或 while,程序员可以使用控制结构有条件地执行或重复执行一组动作。
    • 函数:程序员可以使用函数把行为抽象成可调用的计算单元。
    9.c++是静态类型语言,但不是类型安全语言(允许类型的强制转换)
    10.不可打印字符,转义字符\r,\n,\t,\v,\b,\f,\a,\,?,',",\ooo八进制数\xddd十六进制数
    11.变量的声明:加extern关键字.
    12.const,这个关键字比较重要,注意函数可以基于const重载。但是注意,函数参数是值传递,也就是说,函数调用的时候,如果是实际的对象,函数会使用对象的副本(调用copy构造函数),这个时候const会歧义,从根上来说,有无const都无法修改原来的对象,所以无法基于这种情况重载;但是可以基于const指针和const引用重载,表明指针或引用指向的对象是const。关于类的const函数,const放在()后面,const修饰this指针,this指针是类非static成员的隐含参数,所以能够基于const重载,同时该const函数由const对象调用。const定义的全局对象默认是本文件可见,如果想全局可见,在最前面加extern(或者说非const全局对象默认是extern修饰的)。
    const指针(int const p,需要初始化,不能让其指向别的对象)和指向const对象的指针(const int p,不能改变对象的值,可以先不初始化),主要看const在的前后,前就是对象是const,后就是const指针。注意typedef定义过的类型:typedef int intptr; const intptr p = ...;//必须初始化,因为这时候,p 类似于int* const p。const对象只能用const指针来指向。
    const 允许出现在类型的前面或者后面,相同效果,但是*这个符号的前后,是有差别的。
    13.指针和引用是复合类型,所谓复合类型是因为他们在其他类型基础上的一种类型。引用是对象别名,必须在定义时初始化(除函数的参数外),且无法修改其指向其他对象(注意是别名),使用别名实际上是用的是对象本身。const 引用允许是一个表达式的值,但是非const引用不行,因为const引用表明没有改变结果的可能性(编译器会在const变量使用处替换为该表达式),所以允许是一个中间的结果。但是非const引用需要改变对象的值,需要有对象存在。
    14.隐式转化: double d = 1.2; int& i = d;//实际上中间会有一步 int temp = d; int& i = temp; //这有语义错误,所以这种定义是会有编译错误的。如果是const引用则不会有问题,因为const已经表明变量没有被修改的可能。所以非const引用只能绑定同类型的对象。
    15.enum name{enum1,enum2};//注意enum跟class一样,定义了一种新的类型。其成员是常量,值默认从0开始,依次加1,可以自己定义某个成员的值,后面的成员从该成员后加1.
    16.头文件,注意使用头文件保护符,以免重复包含。#ifndef #define #endif. 头文件主要用于声明,只有三个例外:类的定义,const对象(const对象仅本文件可见,属于文件的局部变量(.obj)),inline函数(如果多个头文件有相同的函数,必须定义相同)。inline函数因为需要在调用处展开,所以需要对编译器可见,所以需要源代码,inline放在头文件中的好处就在于此。inline函数可以在多个文件定义,但是必须函数体相同,但要保证在某个源文件只定义一次。(其实源文件编译为.obj,函数属于本文件可见。)在头文件定义函数并不是不可以,不明智,不科学。inline函数这样做有其现实意义。
  2. 函数的参数的值和返回值都会调用copy构造函数,除非使用引用。注意如果函数返回值类型是一个引用,注意不要返回函数中定义的临时变量。

(1) istream& getline (istream& is, string& str, char delim);

(2) istream& getline (istream& is, string& str);

  1. 链接指示 extern "C", 编译器按处理普通 C++ 函数一样的方式检查对外部语言函数的调用(返回值,参数列表),但是,编译器一般必须产生不同的代码来调用用其他语言编写的函数。extern "C" 可以修饰单个函数,也可以修饰多个函数,也可以修饰头文件(需要用{}括起来),也可以到处C++函数到其他语言,也是用extern "C"修饰,其他语言应该还有extern "Ada"等。注意C语言不支持函数重载,所以不要extern两个同名的重载函数。C和C++的函数指针也是不同的类型,不可以相互赋值。链接器到底怎么做呢?可以直接链接C的函数,反之不然?
    20.字节对齐,struct的自己对齐,为了存取方便,一般编译器会将struct的变量放在其大小的整数倍的地址上,所以假设int成员前面有一个bool,那么bool会占用四个字节,然后才存储int,所以一般将bool放在一起比较好。union的大小等于单个元素所占空间最大的成员的最小倍数,这个空间要大于或等于最长的成员所占用的字节数。如 union myunion{int i,char c[4]}; 大小会是8.
    21.操作符的结果是一个对象。操作符重载,必须有一个是类的对象。
    22.copy构造函数,和赋值操作符,析构,默认构造函数,如果没有显式定义,则类会为我们定义一个。注意,赋值操作符,只有在非定义的时候调用,如果发生对象的定义,则会调用copy构造函数,而不会调用赋值操作符重载的函数。
    23.const_cast(expression),一般用来定义一个非const指针或引用指向一个const指针或引用。
    24.关于char** 不能转换到const char,是类型不能转换,I dont know why. 但是const char 是(p)指向的object的值不能变,p可以指向其他object。char(p),当然可以使用const_cast进行转换后赋值。
    25.va_list //typedef char * ; va_start(ap,v) //((void)(ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v))); va_arg(ap,type) //((t)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t))); va_end(ap);//((void)(ap = (va_list)0)). 在stdarg.h中定义。参数按4个字节对齐,所以_INTSIZEOF
    26.string* s1,s2; s2 is string, not string. so which type of writing format you want to use. string s1,s2; I think it is better. 指针对象,也是对象。&(&i);//incorrect. &操作的对象必须是一个lvalue,但是(&i)返回的不是一个lvalue,是一个数值常量。[]下标操作符返回的是实际的对象,而不是指针。数组名可以看作数组的首指针。

转载于:https://www.cnblogs.com/d-dream/p/5260426.html

C++ primer - - 第一部分相关推荐

  1. C++Primer 第一章 快速入门 学习

    C++已经学习2年了,现在回头想巩固一下基础,就从C++primer第一章开始吧. 1.1 编写简单的C++程序 main函数是程序的入口函数. 编译与执行 GNU 编译环境 在GNU编译器下,需要输 ...

  2. C++ primer第一章练习笔记及书店程序

    第一章 1.5.1节练习 练习1.20 头文件 Sales_item.h 头文件源码 #ifndef SALESITEM_H #define SALESITEM_H #include <iost ...

  3. C++primer第一章 开始

    运算符打印endl,这是一个被称为操纵符(manipulator)的特殊值.写入endl 的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中.缓冲刷新操作可以保证到目前为止程 ...

  4. 《C++ Primer第五版》第一章-------IO机制和注释缩进

    C++ Primer第一章的内容相对来说比较基础,主要是对C++中程序编译的流程.C++中的IO机制,for和while循环的介绍.类的构成和注释方法及缩进方法做了简要的介绍,本次博客主要从C++中的 ...

  5. C++ Primer读书摘要(一)

    C++ Primer 第一章 快速入门 1.1 编写简单的C++程序 任何一个都要包含一个main函数,因为这个函数是系统执行入口c++也一样,函数格式是 int main(); 和别的主要函数不同C ...

  6. 备战金九银十,阿里P8师兄指导完整攻略(附:学习资料+面试宝典+项目实战笔记)

    前言 还剩下两个月就到了金九银十,一般来说,秋招的含金量明显是高于春招的. 那么如何准备即将到来的面试热潮呢?运筹帷幄之后,决胜千里之外! 坚决不打毫无准备的仗是小编的原则:不论是笔试还是面试都是有章 ...

  7. Android开发六年收获阿里offer定级P7,多亏在阿里P8师兄给的攻略、面试技巧以及学习笔记!!!

    前言 又到了每年的毕业季,应届毕业生在找工作过程对于简历设计和面试技巧有一定的欠缺,这对于求职是比较重要的两个因素,因此掌握一定的面试技巧对于找互联网技术岗位的工作帮助非常大.本篇文章给大家分享一波职 ...

  8. 2020下半年,最接地气的字节跳动Android面经分享(已收offer

    view的绘制过程 滑动冲突 接口和抽象类的区别 内部类和静态内部类的区别 string stringbuffer stringbuilder hashmap的源码结构,arraylist,linke ...

  9. Kotlin 资源大全

    官网及文档 Kotlin 官网 Kotlin 文档 Kotlin 中文文档 Kotlin on GitHub 中文社区 掘金技术社区 教程 & 文章 视频教程 Kotlin 系列视频教程 开始 ...

最新文章

  1. 实例1 -- 判断输入年份是否为闰年
  2. CentOS进不了系统
  3. django中html中图片路径怎么写,django css样式,图片路径问题解决方案
  4. python合法关键字是_python练习题-day18
  5. Outlook2013修改数据文件默认存放目录
  6. Android studio删除sdk的方法(图文教程)
  7. mysql orm c语言_【译】Simple MySQL ORM for C
  8. silverlight开发无法调试问题
  9. 正确理解Python函数是第一类对象
  10. torch tensor去掉1维_浑身是刺的“维c之王”,有人管它叫“菠萝”,有人管它叫“梨”...
  11. 【系统篇】从int 3探索Windows应用程序调试原理
  12. css固定定位与绝对定位的区别
  13. linux上运行onedrive,教你如何在Linux中同步微软 OneDrive
  14. [转]C#利用委托跨线程更新UI数据
  15. 汽车系统实现--搜索功能
  16. hue安装使用,集成数据库
  17. 使用Node.js 搭建静态服务器
  18. 全国各省二氧化碳排放量统计数据(1995-2016年)
  19. VueI18n国际化vm._watchers[0].constructor未定义的解决办法:修改源代码吧
  20. Nginx负载均衡状态值max_fails和fail_timeout

热门文章

  1. python读取excel日期内容读出来是数字-Python xlrd读取excel日期类型的2种方法
  2. python中文叫什么意思-python中文叫什么
  3. python的none是什么-Python中的None与Null(空字符)的区别
  4. python编写程序-30分钟学会用Python编写简单程序
  5. CNN 模型的参数(parameters)数量和浮点运算数量(FLOPs)是怎么计算的
  6. EnableFeignClients注解解析
  7. 【Kafka】Kafka为什么要加入分区的概念
  8. TreeView的异步延时加载
  9. 1475 m进制转十进制
  10. 第二次数据库作业--gui