《C++ Primer》全书第一轮学习笔记汇总
C++Primer学习笔记概要
C++Primer学习笔记概要C++ Primer学习笔记第2章变量和基本类型1.在命令行下看main函数的返回值,Unix为(echo $?),Windows为(echo %ERRORLEVEL%)。
2.为了兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符(null)。
3.多行字面值:在一行的末尾加一反斜线符号(\)可将此行和下一行当做同一行处理。
4.C++支持两种初始化变量的形式:复制初始化和直接初始化。
复制初始化语法用等号(=),直接初始化则是把初始化放在括号中。
5.声明和定义:声明不能初始化,也不会分配空间。
在C++语言中,变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量。
6.因为常量在定义后就不能被修改,所以定义时必须初始化。
非const变量默认为extern,const变量默认非extern。
7.引用是别名:必须在定义引用时进行初始化。
当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象,不可能将应用绑定到另一个对象。
不能定义引用类型的引用。
8.const引用是指向const的引用,可以绑定到const对象、非const对象和右值。
非const引用只能绑定到非const对象。
9.因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。
但有三例外:头文件可以定义类、值在编译时就知道的const对象和inline 函数。
第3章标准库类型1.不应该在头文件中使用using (namespace),因为头文件会影响包含它的源文件。
2.任何存储string的size操作结果的变量必须为string::size_type 类型。
特别重要的是,不要把size的返回值赋值给一个int变量。
(为什么我测试可以)3.当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的。
4.vector:vector容器内的元素可以通过下标操作和迭代器进行访问修改,但添加元素必须通过vector的方法insert、push_back才行。
C++Primer学习笔记
第1 章快速入门写程序的一般步骤:定义数据结构保存数据、定义函数、定义变量、实现处理逻辑、实现输入输出1.1main函数由操作系统调用,main函数执行完时返回一个值给操作系统,返回0表示成功执行。
记住:main函数是唯一被操作系统显示调用的函数;main函数返回类型必须是int型return返回值的类型必须和函数返回类型相同或者可以转换成函数的返回类型1.2iostream库:类istream,ostream标准输入:istream类对象cin标准输出:ostream类对象cout。
读cin会刷新cout,当程序正常结束时也会刷新cout。
标准错误:ostream类对象cerr。
默认情况下cerr不缓冲。
标准日志:ostream类对象clog。
默认请问下写到clog时带缓冲。
命名空间:C++标准库定义的名字在命名空间std中输出操作符<<:将右操作数写到左操作数ostream对象中,返回左操作数。
注意cout<<”Enter two nubmers:”是一个表达式,其返回结果是左操作数的值(即输出流cout本身),因此输出请求可以链接在一起;由操作符重载知<<相当于一个函数,传入实参是两个操作数,返回值是表达式结果。
操纵符endl:换行,会刷新输出流(理解:即刷新与设备相关的缓冲区)作用域操作符”::”:std::cout表示使用命名空间std中的cout输入操作符>>:从左操作数istream对象中读取数据保存到右操作数对象中,并返回左操作数1.4标准C++中,for语句头中定义的计数变量是局部的,for循环结束后这个变量不可访问,而以前版本的C++中是可访问的文件结束符的键入:Windows中键入Ctrl+z,Unix/Linux/Mac Os中键入Ctrl+d1.5内置类型:C++内建的数据类型,如int,char等类类型:用class c_name定义的类c_name可理解为一种新的数据类型(c_name 类型),可以像使用int,long,char等内置类型一样使用c_name类型来定义变量头文件的引入:标准库的头文件用< >括起来,非标准库的头文件用双引号””括起来第2 章变量和基本类型2.1动态类型语言:在运行时才执行类型检查,结果可以直接使用一个变量,无需事先定义,如Smalltalk Python静态类型语言:在编译时执行类型检查,结果是程序使用某个名字前,必须告知编译器该名字的类型,如C++基本内置类型:包括算术类型(整数、浮点数、字符、布尔值)和void特殊类型,C++标准定义了每个算术类型的最小存储空间,但并不阻止编译器使用更大的空间整型:bool,char,wchar_t,short,int,long。
C++Primer学习笔记
第九章:顺序容器容器:就是一些特定类型对象的集合顺序容器:为程序员提供了控制元素存储和访问顺序的能力,这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。
9.1 顺序容器概述Vector 可变大小数组。
支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢String 与vector类似的容器,但专门用于保存字符,随机访问快,在尾部插入/删除速度快Deque 双端队列,支持快速随机访问。
在头尾位置插入/删除速度很快List 双向链表,只支持双向顺序访问。
在list中任何位置插入和删除操作速度都很快Forward_list 单向链表。
只支持单项顺序访问。
在链表中任何位置进行插入和删除操作速度都很快如何确定使用哪种容器1)除非你有很好的理由选择其他容器,否则应使用vector2)如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list3)如果程序要求随机访问元素,应使用vector或deque4)如果程序要求在容器的中间插入或删除元素,应使用list或forward_list5)如果程序需要在头尾位置插入或删除元素,但不会在中间位置进行插入或删除操作,应使用deque 6)若不确定应该使用哪种容器,那么可以在程序中只使用vector和list公共的操作:使用迭代器,不适用下标操作,避免随机访问。
9.2 容器库预览容器均定义成模板类,我们必须提供额外信息来生成特定的容器类型,如list<sales_data>容器操作:1)类型别名Iterator 迭代器类型Const_iterator 可以读取元素但不能修改元素的迭代器类型Size_type 无符号整数类型,足够保存此种容器类型最大可能容器的大小Difference_type 带符号整数类型,足够保存两个迭代器之间的距离Value_type 元素类型2)构造函数C c; 默认构造函数,构造函数C c1(c2); 构造c2的拷贝c1C c(b,e); 构造c,将迭代器b和e指定的范围内的元素拷贝到cC c{a,b,c…} 列表初始化c3)赋值与swapC1=c2; 将c1中的元素替换为c2中的元素C1={a,b,c…} 将c1中的元素替换为列表中元素A.swap(b) 交换a和b的元素Swap(a,b) 同上4)大小C.size() c中元素的数目C.max_size() c可保存的最大元素数目c.empty() 若c中存在元素返回false,否则返回true5)添加/删除元素c.insert(args) 将args中的元素拷贝进cc.emplace(inits) 使用inits构造c中的一个元素c.erase(args) 删除args指定的元素c.clear() 删除c中所有元素,返回void6)关系运算符==,!= 所有容器都支持相等(不等)运算符<,<=,>,>= 关系运算符(无须关联容器不支持)7)获取迭代器C.begin(),c.end() 返回指向c的首元素和尾元素之后位置的迭代器C.cbegin(),c.cend() 返回指向c的首元素和尾元素之后位置的常量迭代器Reverse_iterator 反向迭代器Const_reverse_iterator 反向常量迭代器C.rbegin(),c.rend() 返回指向c的首元素和尾元素之后位置的反向迭代器c.crbegin(),c.crend() 返回指向c的首元素和尾元素之后位置的反向常量迭代器9.2.1 迭代器●迭代器范围迭代器范围:由一对迭代器表示,两个迭代器分别指向同一个容器中的元素或者是尾元素之后的位置对构成范围的迭代器的要求1)它们指向同一个容器中的元素,或者是容器最后一个元素之后的位置2)我们可以通过反复递增begin到达end.●9.2.2 容器类型成员iterator, const_iterator, reverse_iterator, size_type, difference_type, value_type等等●9.2.3 begin和end成员List<string> a={“a”,”b”,”c”};List<string>::iterator itr=a.begin();List<string>::const_iterator citr=a.cbegin();List<string>::reverse_iterator ritr=a.rbegin();List<string>::const_reverse_iterator critr=a.crbegin();List<string>::const_iterator citr=a.begin();//a 为const●9.2.4 容器定义和初始化6种初始化方式:1)C c; 默认构造函数初始化2)C c1(c2); c1初始化为c2的拷贝,c1和c2必须是相同类型(相同容器,相同元素类型)3)C c1=c2; 同上4)C c1{a,b,c…} 将c初始化为初始化列表中元素的拷贝,列表中元素的类型必须与c的元素类型相容5)C c1={a,b,c…} 同上6)C c(b,e) 将c初始化为迭代器b和e指定范围中的元素的拷贝7)C seq(n) seq包含n个元素,这些元素进行了值初始化,此构造函数是explicit的8)C seq(n,init) seq包含n个初始化为值init的元素//只有顺序容器的构造函数才能接受大小参数●9.2.5 赋值与swap如果两个容器原来大小不同,赋值运算后两者的大小都与右边容器的原大小相同C1=c2;C1={a,b,c};//赋值后c1的大小为3Swap(c1,c2); 交换c1和c2中的元素。
C Primer Plus(第五版)学习笔记
C Primer Plus(第五版)学习笔记第一章概览1.1 C语言的起源记住Dennis Ritchie和Ken Thomson。
是在设计UNIX操作系统的时候开发的。
1.2 使用C语言的理由C是一种融合了控制特性的现代语言,而我们已发现在计算机科学的理论和实践中,控制特性是很重要的。
其设计使得用户可以自然地采用自顶向下的规划、结构化的编程,以及模块化的设计。
这种做法使得编写出的程序更可靠、更易懂。
C是一种高效的语言。
C程序往往很紧凑且运行速度快。
C是一种可移植语言。
由于C与UNIX的紧密联系,UNIX系统通常都带有一个C编译器作为程序包的一部分。
Linux中同样也包括一个C 编译器。
C强大而又灵活(计算机世界中经常使用的两个词)。
C面向编程人员的需要。
它允许您访问硬件,并可以操纵内存中的特定位。
它具有丰富的运算符供选择,让您能够简洁地表达自己的意图。
多数C实现都有一个大型的库,其中包含有用的C函数。
这些函数能够处理编程人员通常会面对的许多需求。
C的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。
没有谁强迫您编写含糊难懂的代码,但存在这样的可能性。
试问,除C之外还有哪种语言存在一年一度的“含糊代码”(ObfuscatedCode)竞赛呢?1.3 C语言的发展方向不管C++和Java这些较新的语言如何流行,C在软件产业仍然是一种重要的技能,在最想获得的技能中,它一般都列在前10名。
特别是在嵌入式系统的编程中,C已开始流行。
也就是说,它将用来为汽车、照相机、DVD播放器和其他现代化设备中逐渐普及的微处理器编程。
同样,C已开始进入长期以来一直属于FORTRAN的科学编程领域。
最后,由于它是一种适合用来开发操作系统的语言,C在Linux的开发中也扮演着重要的角色。
1.4 计算机工作的基本原理CPU的工作非常简单,至少在我们所做的这一简短描述中是这样的。
它从内存中获取一个指令并执行该指令,然后从内存中获取下一个指令并执行。
c primer学习笔记
C Primer始于2014-11-12文字颜色说明:1)正文中的黑色粗字体表示首次看时,觉得比较重要的文字2)正文中的红色表示,复习笔记后添加的知识点ANSI(American National Standards Institute) 美国国家标准协会第13章文件输入输出13.1 和文件进行通信13.1.1 文件是什么C将文件看成是连续的字节序列,其中每一个字节都可以单独的读取;13.1.2 文本视图和二进制视图二进制视图中,每一个字节都可以为程序所访问;文本视图中,不同的操作环境(操作系统),程序所看到的内容和文件有可能不同(例如行尾的标志)13.1.4 标准文件C语言提供3种标准文件。
标准输入、标准输出、标准错误输出;✧标准输入:getchar()、gets()、scanf()✧标准输出:putchar()、puts()、printf()13.2 标准I/O13.2.1 检查命令行参数return 0 与exit(0)的区别:✧最初调用的main函数中二者是一样的,main在一个递归程序中时,exit()会终止程序,而return只返回递归的前一级。
✧在main函数以外的函数中调用exit也会终止程序13.2.2 fopen()函数fopen(参数1,参数2)✧参数1:是一个地址(指针或数组),数组中包含要打开的文件名✧参数2:是一个字符串,指定打开文件的模式。
有以下7大类模式1)“r”打开一个文本文件,可以读取文件2)“w”打开一个文本文件,可以写入文件,先将文件长度截为0。
若该文件不存在,先创建3)“a”打开一个文本文件,向已有文件的尾部追加内容。
若不存在,先创建4)“r+”打开一个文本文件,可以进行更新,也可以读取和写入5)“w+”打开一个文本文件,可以进行更新(读取和写入)。
先将文件长度截为0,没有则先创建6)“a+”打开一个文本文件,可以进行更新(读取和写入),读取整个文件,写入时只能向尾部追加内容✧返回:fopen函数返回一个文件指针fp,这个指针指向FILE(stdio.h中定义的一种派生类型),fp指向关于文件的信息的数据包。
CPrimer读书笔记
C++ Primer读书笔记1. main函数返回类型必须为int2. main函数的返回值常常被用来指示状态。
返回值为0表示成功,非0的含义由系统定义3.类型不仅定义数据元素的内容,还定义了这类数据上可以进行的运算4.访问main的返回值依赖于系统。
Unix中使用命令: $ echo $?Windows中: $ echo%ERRORLEVEL%5. iostream库包含两个基本类型istream和ostream. 标准库定义了4个IO对象:istream类型对象cin. ostream类型对象cout, cerr, clog.系统将程序运行的窗口与对象关联。
读取cin时,数据从程序正在运行的窗口读入。
向cout, cerr, clog写入数据时,将会写入同一个窗口。
6. 在for循环头中定义的循环变量仅在循环内部存在,循环结束后不能使用。
7. 当使用istream对象作为条件时,其效果是检测流的状态。
如果流是有效的。
检测成功。
遇到文件结束符,或遇到无效输入,istream对象状态变为无效,条件变为假。
8.文件结束符,Unix中Ctrl+D, Windows 中Ctrl+Z,然后Enter或Return9.注意保持风格一致性10.使用文件重定向来调试程序。
Unix中命令: $ 可执行文件名<infile >outfile可执行文件从infile中读取数据,将输出结果写入outfile,两个文件都在当前目录中11.调用运算符(),内部放置实参列表++是静态数据类型语言,其类型检查发生在编译时++基本数据类型包括算术类型与空类型。
算术类型包括整型与浮点型。
算术类型的尺寸在不同机器上有所差别,C++标准规定尺寸的最小值。
的空间应确保存放机器基本字符集中任意字符对应的数字,故其大小与机器字节相同15.计算机以2的整数次幂个比特作为块处理内存,可寻址的最小内存块是字节(byte),存储的基本单元是字(word),通常由几个字节组成。
《C++ Primer》MSDN读书笔记
《C++ Primer》读书笔记Chapter 1. Getting Started1.1.4.读入未知数目的输入int value;while (std::cin >> value){…}std::cin >> value先从标准输入中读取一个数保存在value中,输入操作符返回其左操作数。
while中条件测试std::cin,即测试流的状态。
如果流是有效的,那么测试成功。
遇到文件结束符或遇到无效输入时,如读取了一个不是整数的值,则istream对象是无效的。
windows 下Ctrl-Z来输入文件结束符,unix下Ctrl-DCharpter 2. 变量和基本类型2.1.1. 整型3.整型的赋值8位的unisinged char,其取值范围从0到255。
如果赋值超过这个范围的值,那么编译器将会取该值对256求其模后的值。
(336存储到unsigned char中,实际赋值位80,336%256 =80)对于unsinged char类型来说,负数总是超出其取值范围。
同样取模,所以-1存储到unsinged char中,实际值是255)当将超过取值范围的值覆给singed类型时,由编译器决定实际的值。
在实际操作中,很多编译器处理signed类型的方式和unsigned类型类似。
2.1.2.浮点型一般flaot类型用32位表示,double用64位,long double用三个或四个字(96或128位)来表示。
类型的取值范围决定了浮点数所含的有效数字位数。
float型只能保证6位有效数字,而double型至少可以保证10位有效数字。
2.2 字符面值std::cou\t << “Hi” << st\d::endl;等价于std::cout << “Hi” << std::endl;可以使用这个特性来编写长字符串字面值:std::cout << “a multi-line \string literal \using a backslash”<< std::endl;反斜线符号必须是该行的尾字符(不允许其后面由注释或空格),同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。
C++Primer读书笔记(全)
第一章快速入门1.main函数的两个参数int argc(argument count)与char *argv[](argument variable)(或者char **argv[])1.标准库四种流:cin,cout,cerr,clog2.输出操作符返回的是输出流本身即cout<<”hello c++”;返回值为cout,因此可以进行链接。
cin也是如此。
endl是一个操纵符,输出换行,并刷新缓冲区。
space命名空间命名空间可以是全局的,也可以位于另一个命名空间之中,但是不能位于类和代码块中。
所以,在命名空间中声明的名称(标识符),默认具有外部链接特性(除非它引用了常量)。
// out.hnamespace Outer { // 命名空间Outer的定义int i; // 命名空间Outer的成员i的内部定义namespace Inner { // 子命名空间Inner的内部定义void f() { i++; } // 命名空间Inner的成员f()的内部定义,其中的i为Outer::iint i;void g() { i++; } // 命名空间Inner的成员g()的内部定义,其中的i为Inner::ivoid h(); // 命名空间Inner的成员h()的声明}void f(); // 命名空间Outer的成员f()的声明// namespace Inner2; // 错误,不能声明子命名空间}void Outer::f() {i--;} // 命名空间Outer的成员f()的外部定义void Outer::Inner::h() {i--;} // 命名空间Inner的成员h()的外部定义// namespace Outer::Inner2 {/*……*/} // 错误,不能在外部定义子命名空间注意:1.不能在命名空间的定义中声明(另一个嵌套的)子命名空间,只能在命名空间的定义中定义子命名空间。
C++ Primer笔记
C++ Primer 笔记快速1.操作系统通过main函数返回的值来确定程序是否成功执行完毕,返回0值表名程序成功执行完毕。
每个C++程序必须包含main函数,且main函数是唯一被操作系统显式调用的函数。
2.定义函数必须指定四个元素:返回类型、函数名、圆括号内的形参表(可以为空)和函数体。
3.术语“流”视图说明字符是随着时间顺序生成或消耗的。
4.标准库定义了四个IO对象:cin 、cout 、cerr(标准错误,用于输出警告和错误信息给程序的使用者)和clog(用于产生程序执行的一般信息)。
5.按错误报告的顺序改正错误是一个好习惯,因为一个错误可能会产生一连串的影响。
6.标准库的头文件用尖括号<>括起来,非标准库的头文件用双引号””括起来。
7.Argument(实参)传递给被调用函数的值。
8.Built-in type(内置类型)、curly brace(花括号)、edit-compile-debug(编辑-编译-调试)使得程序正确执行的过程、end-of-file(文件结束符)、for statement(for 语句)、manipulator(操作符)、preprocessor directive(预处理指示)、string literal(字符串字面值)、uninitialized variable(未初始化变量)。
第一部分1.标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。
有些标识符(在函数外定义的标识符)不能以下划线开头。
2.类型决定了分配给变量的存储控件的大小和可以在其上执行的操作。
3.初始化的两种方式:int ival(1024); // direct-initialization (直接初始化)Int ival = 1024 // copy-initialization (复制初始化)在初始化类类型对象时,直接初始化语法更灵活且效率更高。
而初始化内置对象时,两者没什么差别。
C++ primer读书笔记
1. 每个C++程序必须含有main函数,而且main函数是唯一被操作系统显示调用的函数。
2.std::cout<<"Enter two numbers:";std::cout<<std::endl;endl是一个特殊值,称为操作符(manipulator),将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区(buffer);忘记刷新输出流可能会造成输出停留在缓冲区中,如果程序崩溃,会导致对程序崩溃位置的错误推断。
3.C++程序中大部分出现的空格符的地方可以用换行符代替。
两个例外是:1、字符串字面值中的空格符不能用换行符代替2、空格符不允许出现在预处理指示中4.定义变量时,应该给变量赋初始值5.太多的注释混入代码可能会使代码难以理解,通常最好是把一个注释块放在所注释的代码的上方6.自定义头文件用双引号(“”)把头文件括起来(通常在源文件所在路径),标准库的头文件用<>括起来(在系统路径环境中查找)7.8位块一个字节,32位块四个字节作为一个字8.超出取值范围的赋值将会被采取取模操作9.0开头的字面值整数表示八进制,0x开头的整数表示十六进制10.定义长整形的时候,应该使用大写字母L,表示扩展精度,避免小写的l与1混淆123u /*unsigned*/123L /*long*/11.'a'之前加上L,可以得到wchar_t类型的宽字符字面值L'a'12.在一行末尾加'\'可以将此行与下行作同一行处理,但是后面不能加注释或空格13.命名习惯最重要的是保持一致14.复制初始化int ival = 1024;直接初始化int ival(1024); //更加灵活且效率更高初始化不是赋值,赋值是擦除原来的数值15.计数器初始化string变量std::string all_nines(10,'9');得到的值是999999999916.const变量定义后就不能修改,所以必须初始化17.extern const int bufsize = 1024对const变量指定extern可以让整个程序中访问const对象18.引用——对象的另一个名字int ival = 1024;int &refval = ival; //对引用对象复制必须用与该引用同类型的对象初始化,而且必须在定义引用对象的时候对其初始化赋值可以读取但不能修改引用的对象19.枚举类型enum open_modes {input, output, append = 1 , another};第一个枚举成员赋值为0,第二个是1,第三个是1,第四个是220.类定义后面要加分号21.默认情况下struct成员为public,class成员是private22.预处理可以防止头文件被反复引用#ifndef SALESITME_H#define SALESITME_H#endif23.使用命名空间using std::cin;using std::cout;using std::string;24.任何储存string的size操作结果的变量必须是string::size_type类型,不要把size的返回值赋值给int变量for(string::size_type index = 0; index != s.size(); ++index)25.任何一个大写字母都小于任何一个小写字母26.对字符串进行混合连接操作时,+操作符的作用操作数必须至少有一个是string类型的错误的连接:string s1 = "hello" + ", ";string s2 = "hello" + "11" +s1;27.C标准库的文件命名name.h形式在C++中为cname.h28.C++程序员优先选用!=而不是<来编写循环判断条件29.vector可以使用下标操作,但是下标必须是已经初始化的元素才错误的尝试使用下标对vector进行添加操作方法:vector<int> ivec;for (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec[ix] = ix; //错误,ivec没有元素初始化vector的添加元素for (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec.push_back(ix);30.所有的标准库容器都定义了相应的迭代器类型,只有少数容器支持下标操作vector<int>::iterator iter;31.每种容器定义都定义了一对命名为begin和end的函数32.迭代器使用示例:for (vector<int>::iterator iter = iver.begin();iter != ivec.end(); ++iter) //end操作返回的迭代器不指向vector中任何实际元素*iter = 0; //解引用操作符*,访问迭代器指向的元素33.声明一个const迭代器的时候,必须初始化迭代器34.二进制位集处理标准库bitset,在定义bitset时要明确bitset含有多少位bitset<32> bitvec;长度值必须是整型值常量或者是已用常量值初始化的整形的const对象35.用string对象初始化bitset对象时,string对象直接表示为位模式。
c primer plus 笔记01
第一章概论使用 C语言的理由:1、设计特性:自顶向下的规划、结构化编程,模块化设计2、高效性:可表现出通常只有汇编语言才有的精细控制能力3、可移植性:除访问特定硬件设备或操作系统特殊功能外,大多可移植ps:这三点是C刚面世时的优势,而现在看来,除了第二点具有巨大优势以外,其他的两点已经算不上亮点了。
C语言缺点:1、 C在表达方面的自由会增加风险(尤其是指针操作)2、可能会编写出极难理解的代码3、不是面向对象的语言使用 C语言的7个步骤(重要):1、定义程序目标:考虑程序需要的信息、计算、操作以及程序反馈的信息2、设计程序: a 用户界面、程序的组织、目标用户、完成程序所需时间b 确定程序表示数据和处理数据的方法3、编写代码:将程序设计解释为 C语言4、编译5、运行程序6、测试和调试程序7、维护和修改程序:对程序做清楚的文字注释和采取良好的设计编译机制库代码启动代码源代码→编译器→目标代码→链接器→可执行代码inform.c inform.o a.exeinform.objLinux上编译器命令行为 gcc inform.c -o inform单源文件的编译不保留目标代码,在代码编译成功后即被删除多源文件的编译会保留目标代码,后续不改动的部分可以直接引用其目标代码和新代码一起编译。
第二章 C语言概述典型的 C程序:#include →int main()→function a()→function b()预处理器指令main()总是第一个被调用C中有5类语句:declaraton, assignment, function, control, null头文件包括了建立最终的可执行文件时编译器所需要的信息编译器的链接部分负责找到所需的代码库声明变量注意事项:1、名字尽量有意义,从而使程序更易读2、名字可供使用的字符包括:大小写字母,数字,下划线_3、第一个字符必须是字母或下划线(不能是数字)使代码可读性高的技巧:1、选择有意义的变量名和使用注释2、使用空行分隔一个函数中概念上的多个部分3、每个语句用一行4、在,.等标点符号后面打空格所有的 C程序都是从main()函数开始执行,不管它处于什么位置C的惯例是把main()放在开头,因为它通常为程序提供最基本的框架。
C++ Primer 第一章快速入门笔记
看到很多人学习这本书都会写下学习过程笔记!因为觉得这是不错的做法,也可以巩固自己学习的知识,还能在以后的学习这本时发现问题,到时也可以到回来修改和补充。
自己在图书馆看完了第一章,小钱问我感觉会不会闷,我说我觉得很爽!我不打算很快地把它看完,我要把每个知识点都掌握,所以刚开始会看得很慢,我也不急,就像小钱说的稳扎稳打,一步一个脚印一样。
因为有C++基础,所以看这本书并不困难,看过之后,发现这本书确实不适合新手去读,最好要有点基础才行,好了废话不多说,开始写这一章的笔记了。
本章呢,介绍C++大部分基本要素:内置类型、库类型、类类型、变量、表达式、语句和函数。
这一章主要是做一个缓冲,后面的章节才慢慢阐明本章的主题。
1.1节-编写简单的C++程序一个C++程序都包含一个或多个函数,其中必须有一个命名为main。
函数由执行函数功能的语句序列组成。
main函数的返回值必须是int型,该类型表示整数。
int类型是内置类型,即该类型是由C++语言定义的。
C++中多数语句以分号作为结束标记。
(容易被忽略)return语句带上一个值时,这个值就是函数的返回值。
返回值类型必须和函数的返回类型相同。
——编译与执行程序这本书程序好像是调用GUN编译器,我一直用的是Visual C++ 6.0,算是一个比较老的编译器,最近开始用Visual Studio系列的编译器,还不怎么会用,有点悲催!——程序源文件命名规范源文件的名字由文件名和文件后缀两部分组成。
visual Studio 编译器后缀形式是(.cpp)1.2节——初窺输入/输出这种功能是由标准库提供的(iostream库)istream和ostream,分别表示输入流和输出流标准输入与输出对象分别是cin和cout,标准库还定义了另外两个ostream对象分别命名为cerr和clog;课本代码如下:#include<iostream>int main(){std::cout<<"Enter two number:"<<std::endl;int v1,v2;std::cin>>v1>>v2;std::cout<<"The sum of"<<v1<<"and"<<v2<<"is"<<v1+v2<<std::endl;return 0;}程序的第一行是一个预处理指示,尖括号里的名字是一个头文件1.写入到流形式:(std::cout);<<是输出操作符endl是一个特殊值,称为操作符,具有换行的效果,并刷新与设备相关联的缓冲区。
CPrimer读书笔记
(从后向前看)标题:重载函数再论重载函数是C++提出来的概念,但是在C中却未必没有。
比如“1+3”和“1.0+3.0”,虽然都是加法,做的却不是同的操作:编译器要因操作数的不同而调用不同的加法操作。
只是C语言中除了内部类型变量可以参与运算以外,没有“类”这么高深的概念。
“结构体”也只是内存数据的组织方法,而不涉及对整个结构体的处理。
所以,在C语言时代编译器明明做了类似于重载的事情,却可以像雷锋一样“做好事不留名”。
C++发展出了类,并且赋予了“类”很高的期望,类的对象也能像内置类型对象一样参与一切运算。
那么,就拿加法运算来说,编译器如何知道对某类对象的加法该调用哪一个详细的操作代码?于是,即使不出现普通函数的重载,至少运算符是要重载的。
林锐博士在《高质量C++/C编程指南》中为重载函数的必要性提了另一个理由:类的构造函数名称必须与类名相同,而类却经常要定义多个不同的构造函数。
那就只好重载了。
对于普通程序员来说,我们完全可以不用考虑得这么深。
重载函数给我们至少还带来了另一个好处:不用记忆多个不同的函数名了,也不用为了给函数起名而绞尽脑汁了。
不过本书还给出了一个建议:并不是任何时候都有必要重载函数的,有的时候不同的函数名可以直观地带来好多信息,滥用重载只是牺牲了名称中的信息。
标题::重载函数的概念引用:出现在相同作用域中的两个(可以是两个以上——偷猫注)函数,如果具有相同的名字而形参表不同,则称为重载函数。
本节开头第一句话就给出了重载函数的定义:重载函数必须符合两个条件:一是出现在相同的作用域中、二是函数名字相同而形参表不同。
其中第一个条件一般人往往是不去想的,其实函数名相同而作用域不同的函数大大存在,比如在MFC 中就有。
它们是完全不相干的函数。
第二个条件还可以详说一下:函数名字相同当然不在话下,这是函数被称为“重载”的根源。
之于形参表不同,可能表现在形参个数不同、可能表现在形参类型不同、还可能表现在形参顺序不同。
《C++Primer》读书笔记
《C++Primer》读书笔记第⼀章开始类型:程序所处理的数据都保存在变量中,⽽每个变量都有⾃⼰的类型内置类型:语⾔⾃⾝定义的类型(⽽形如string等类型都是标准库定义的)的返回值:0表⽰成功,⾮0指出错误类型从命令⾏运⾏编译器术语表:缓冲区、cerr、clog、表达式第⼀部分 C++基础第⼆章变量和基本类型⼏种字符类型:内置类型的机器实现:将负数转换为⽆符号类型:结果为⽆符号数的模加上这个负数字⾯值常量:每个都对应⼀种数据类型、字符串字⾯值(实际是由常量字符构成的数组),可以指定字⾯值的类型转义序列:回车\r、换⾏\n对象:指⼀块能存储数据并具有某种类型的内存空间初始化:列表、默认初始化的关系:分离式编译、extern复合类型:基于其他类型定义的类型声明符:声明语句int &r;中,&r为声明符,声明符命名了⼀个变量,也指定该变量为与基本数据类型(此例为int)有关的某种类型&引⽤类型:我们称r为引⽤或引⽤类型:*p为声明符,p是变量名,我们称p为指针或指针变量限定符:常量引⽤(对常量的引⽤)、可以将⼀个常量引⽤绑定到变量、字⾯值、表达式(因为不允许通过该引⽤修改这些对象)顶/底层const:执⾏对象拷贝时的限制constexpr:声明常量decltype类型指⽰符:返回表达式的类型编写⾃⼰的头⽂件:头⽂件通常包含那些只能定义⼀次的实体,如类、const、constexpr变量预处理变量:#ifdef、#ifndef、#endif术语表:常量表达式、头⽂件保护符、未定义、void*第三章字符串、向量和数组标准库类型stringstring::size_type类型:string的size函数返回的是⼀个string::size_type类型的值;string类及其他⼤多数标准库类型都定义了⼏种配套的类型,体现了标准库类型与机器⽆关的特性,类型size_type即是其中的⼀种,通过域操作符来表明名字size_type是在类string中定义的、处理string对象中的字符:cctyoe头⽂件中的函数迭代器:使迭代器失效的操作数组:数组的引⽤,数组的下标类型为,数组名和指针标准库函数begin和endc_str函数:返回⼀个C风格的字符串,返回结果是⼀个指针,该指针指向⼀个以空字符结束的字符数组,指针的类型是const char*使⽤数组初始化vector对象:vector<int> vec(begin(arr), end(arr));术语表:直接初始化、值初始化、->运算符第四章表达式表达式:最⼩的计算单元。
CPrimer标准C宝典学习笔记
一、字面值1、字面值分类整形字面值:20、076、0X14浮点字面值:128u、1L布尔字面值和字符字面值:bool test = false 、'a'、L'a'非打印字符的转移序列:\n、\t 、\b字符串字面值:“Hello”注意:只有内置类型有字面值,没有类类型字面值二、左值、右值左值:可以出现在赋值语句左边,也可以在右边出现右值:只能在赋值语句右边出现,不能出现在赋值语句左边三、变量名(即变量的标识符):由字母、数字、下划线组成,但是只能由字母、下划线开头标识符、关键字、操作符关系(集合表示)标识符关键字操作符四、初始化直接初始化:把初始化放在括号中(例如:int val(1024); )简洁初始化:把初始化放在“=”右边(例如:int val = 1024; )初始化内置元素是没有区别的,但是初始化类类型对象还是有细微的差别的,类对象用直接初始化时直接调用与实参匹配的构造函数,而用复制初始化总是调用复制构造。
特别地,由于IO类型对象不能复制,所有对那些类型对象不能复制初始化五、标准库String类型1、初始化方式:string s1; 用默认构造函数初始化,s1为空字符串string s2(s1);string s3("value"); 用字符串字面值初始化string s4(n,'c'); 用n个字符'c'初始化2、string对象的操作s.empty();s.size(); //相当于strlen(),返回的是string::size_type类型s[n];s1+s2;s1 =s2;s1 == s2;s1>=s2;s1 != s23、为什么要s.size()用string::size_type类型而不是int类型由于一些机器上int类型表示范围太小,而一些string对象所包含的你内容可能太大(比如文件),导致溢出,因此不能用int表示,更倾向用比它大一倍的string::size_type。
C++Primer读书笔记
C++Primer读书笔记第一章快速入门1. 每个C++程序都包含一个或多个函数,而且必须有一个命名为main。
函数由执行函数功能的语句序列组成;2. main函数是唯一被操作系统显式调用的函数;3. main函数的形参个数是有限的4. 函数体是函数定义的最后部分,是以花括号开始并以花括号结束的语句块;5. 注释不会增加可执行程序的大小,编译器会忽略所有注释;6. 我们注释的风格是在注释的每一行以星号开始,指明整个范围是多行注释的一部分;7. 我们倾向于把确定函数边界的花括号自成一行,且缩进复合的输入或输出表达式从而使操作符排列整齐;8. 标准库的头文件用尖括号< >括起来,非标准库的头文件用双引号“ ”括起来;第一部分基本语言第二章变量和基本类型1. wchar_t类型用于扩展字符集,比如汉字和日语,这些字符集中的一些字符不能用单个char表示;2. 在位这一级上,存储器是没有结构和意义的;让存储具有结构的最基本方法是用块处理存储;3. 建议:使用内置算术类型;4. 只有内置类型存在字面值,没有类类型的字面值,也没有任何标准库类型的字面值;5. 没有short类型的字面值常量;6. 不可打印字符和特殊字符都用转义字符书写,转义字符都以反斜线符号开始;7. 未定义行为源于编译器不能检测到的程序错误或太麻烦一直无法检测的错误;8. C++是一门静态类型语言,在编译时会做类型检查;9. 左值可以出现在赋值语句的左边或右边,右值只能出现在的赋值语句的右边;10. 变量是左值,数字字面值是右值;11. 对象就是内存中具有类型的区域;12. 标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母。
有些标识符(在函数外定义的标识符)不能以下划线开头;13. C++支持两种初始化变量的形式:复制初始化和直接初始化。
复制初始化语法用等号(=),直接初始化则把初始化式放在括号中;14. 初始化不是复制:初始化指创建变量并给它赋初始值,而赋值则是擦除对象的当前值并用新值代替;15. 在函数体外定义的变量都初始化成0,在函数体里定义的内置类型变量不进行自动初始化;16. 在一个程序中,变量有且仅有一个定义,但可以声明多次。
《C++Primer》第五版习题答案--第一章【学习笔记】
《C++Primer》第五版习题答案--第⼀章【学习笔记】C++Primer第五版习题解答---第⼀章ps:答案是个⼈在学习过程中书写,可能存在错漏之处,仅作参考。
作者:cosefyDate: 2022/1/7第⼀章:开始练习1.3#include<iostream>int main() {std::cout << "hello, world" << std::endl;return 0;}练习1.4:#include<iostream>int main(){int v1 = 0, v2 = 0;std::cout << "please input two numbers: " << std::endl;std::cin >> v1 >> v2;std::cout << "The product of " << v1 << " and " << v2 << " is: " << v1 * v2 << std::endl;return 0;}练习1.5:#include<iostream>int main(){int v1 = 0, v2 = 0;std::cout << "please input two numbers: " << std::endl;std::cin >> v1 >> v2;std::cout << "The product of ";std::cout << v1;std::cout << " and ";std::cout << v2;std::cout << " is: ";std::cout << v1 * v2;std::cout << std::endl;return 0;}练习1.6:结果如下图所⽰,存在报错,显然格式不合法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《C++ Primer》全书第一轮学习笔记汇总(2011.10.02)《C++ Primer》整书学习笔记前言第00章:前言——此次决定了写《C++ Primer》的学习笔记,刚开始时没有想到怎么个写法,是学完一章后直接写章结还是怎样,不知道,后来,在学习的时候,发觉,有很多细节还是很有用的,不想忘了它们,而之前我又学过《C++ Primer Plus》,也有一些内容已经熟记在心里了,所以,现在决定了写这个学习笔记的模式,方法,框架是怎样了。
——首先,我会整章阅读一次,在认为对自己很有帮助,或者是之前还没有接触过的知识点做上记号;然后,这一章结束后,有时我会将其先写到草稿本上;之后,我会将其录入电脑,在录入的时候顺带再强化记忆,然后,如果有些有地方有想说的话的时候,会在后面加一个“摘录有想”说出自己想说的东西,不过有时候太累赘的话就不说了。
——我会经常反复阅读自己的笔记,当然,知道最主要的是上机实践,不懂的时候再返回书本中的内容去看,去练。
——有人说,这本书你可以直接当作字典去查,不用这样一章章地看下去,但是,我想的是,假如连字典中有些什么内容也不知道,提到过的一些知识点不知道的话,需要用到的时候一点反应都没有,怎么往这里去查呢?所以,我还是决定,将这本书看一遍,有些地方细看,有些地方粗看,那么等真正需要用的时候,就可以很快地想出曾经有这么一个东西可以用,曾经书上有提过这么一个东西了。
——我从08月21日开始看了这本书,但是那时还没有开始想到要做笔记,因为害怕看了书后也会没看过一样,吸收不到什么,不知道自己看过什么,所以,我决定了做笔记。
之前一段时间,一直有不少的琐事做着,让我不得连续在这个阵线上学习。
现在,事情很大部分已经解决了,除了每天的上课课程这些学习类的东西干扰这个任务外,基它就基本没有什么了,所以,我接下来,会在兼顾现在的学校的专业课教学内容的同时,做完这本《C++ Primer》的学习笔记,现在已经是2011年09月07日了,大二了,计划2011年10月15日前,将此任务完成。
——当然,会做好计划往往赶不上变化的准备。
那时就,具体问题具体分析。
嗯,加油!《C++ Primer》第一部分学习笔记汇总——基本语言《C++ Primer》第1章学习笔记第01章:快速入门这一章,书上用了一个例子贯穿每部分的内容,“书店的书本销售情况”(包括销售册数与单价)。
第二节:介绍输入与输出@ 学习摘录001:——endl称为操纵符(manipulator),可刷新与设备相关联的缓冲区。
——在刷新缓冲区时,用户可立即看到写入到流中的输出。
——程序员经常在调试过程中插入输出语句,这些语句都应刷新输出流。
摘录有想001:——这几句让我想起之前自己以及朋友们出现过的错误,当if(!cin)时,只是cin.clear()是不够的,还需要用cin.sync()清空缓冲区或者用while(cin.get() != ‘\n’)continue;提取多余字符。
看来以后得多注意输入输出缓冲区了。
第三节:关于注释——当注释多行时,最好能直观指明每一行都是注释。
摘录有想002:——这让我注意到了之前没怎么注意的问题,看《数据结构与算法分析》的一书上是用了这样的格式的,才发觉原来那书的编译习惯是不错的。
/** now, for a example.* like this.*/第四节:控制结构@ 学习摘录003:——关于控制结构我想到的是之前《C++ Primer Plus》上提到过,循环(判断条件),条件if(判断条件)都会将括号内的内容转换为bool型作为执行与否的依据的。
@ 学习摘录004:——编译器能查出的最普通的错误1.语法错误 2.类型错误 3.声明错误摘录有想004:——知道编译能检查出错误的话,在编译习惯上有些就可以利用这一点了,可以避免在调试的时候才发现错误了,这也是一个网友跟我说过起的。
如:if(i = 1),将其写为if (1 = i)的话就能在编译时检测出自己要写的是if ( 1 == i)了。
第五节:类的简介@ 学习摘录005:——什么是成员函数:成员函数是由类定义的函数,有时称为“类方法”(method)@ 学习摘录006:——使用类时需注意的三个问题:——1. 类的名字是什么?2. 它在哪里定义? 3. 它支持什么操作?摘录有想006:——很多同学不明确的一点是第3点,之前我看同学的程序时,问同学你的这个类想要实行什么样的功能时,他自己也答不上。
《C++ Primer》第02章学习笔记第02章:变量和基本类型这一章,主要讲述了常量,变量和一些类型的使用方法,注意事项。
第三节:变量@ 学习摘录007:——C++是一门静态类型语言,在编译的时候会作类型检查,静态类型检查能帮助我们更早地发现错误。
——静态类型使得编译器必须能识别程序中每个实体的类型。
假如没有定义或定义错的时候就能检查出来啦。
@ 学习摘录008:——左值:lvalue,左值可以出现在赋值语句的左边或右边。
——右值:rvalue,右值只能出现在赋值的右边,不能出现在赋值语句的左边。
——变量是左值,因此可以出现在赋值语句的左边,数字字面是右值,因此不能被赋值。
摘录有想008:——在我理解中,因为变量可在左也可在右,因此它为左值,而数字则只能出现在右边,因此它为右值。
@ 学习摘录009:——变量提供了可以操作的有名字的存储区,对象就是内存中具有类型的区域。
摘录有想009:——例如:int a; class b{}; b c; 这里,a 和c属于对象。
@ 学习摘录010:——初始化变量不是赋值。
——初始化:指创建变量并给它赋初始值。
——赋值:是擦除对象的当前值并用新值代替。
@ 学习摘录011:——初始化变量有两种形式。
——1. int ival(1024); // direct-initialization 直接初始化——2.int ival = 1024; // copy-initialization 复制初始化@ 学习摘录012:——复制初始化和直接初始化之间的差别是很微妙的。
——现在我们只需知道,直接初始化的效率更高。
@ 学习摘录013:——未初始化变量引起的错误难以发现,永远不要依赖未定义行为,使用未初始化的变量是常见的程序错误。
虽然许多编译器都至少会提醒不要使用未初始化变量,但是编译器并未被要求去检测未初始化变量的使用。
而且,没有一个编译器能检测出所有未初始化变量的使用。
@ 学习摘录014:——extern声明不是定义,也不分配存储空间。
——事实上,它只是说明变量定义在程序的其他地方。
摘录有想014:——extern的使用得注意,一个文件里面放定义,另外一个文件里面放声明才可以,上次同学就是犯了这样的错误,没有在另一个文件中声明就想用extern变量了。
@ 学习摘录015:——只有当声明也是定义时,声明才可以有初始化式,因此只有定义才分配存储空间。
@ 学习摘录015:——看来下次写程序时真的要直接在声明的时候就定义好,那样的话就安全多了。
@ 学习摘录016:——作用域可以分为三种:——1.全局作用域(global scope)——2.局部作用域(local scope)——3.语句作用域(statement scope)摘录有想016:——有语句for(int val = 1; val <= 10; ++val) sum += val;——此处,val 定义在for语句的作用域中,只能在for语句中使用,而不能在main 函数的其他地方。
@ 学习摘录017:——通常把一个对象定义在它首次使用的地方是一个很好的办法。
放置声明的一个约束是,变量只在从其定义处开始到声明所在的作用域的结束才可以访问。
第五节:引用@ 学习摘录018:——“const引用”的意思是“指向const 对象的引用”。
@ 学习摘录019:——非const引用只能绑定到与该引用同类型的对象。
——const引用则可以绑定到不同但相关的类型对象或绑定到右值。
第八节:类类型@ 学习摘录020:——每类都定义了一个接口(interfer)和一个实现。
——接口由使用该类的代码需要执行的操作实组成。
——实现一般包括该类所需要的数据。
——类体定义了组成该类型的数据和操作。
操作称为成员函数,数据则称为数据成员。
@ 学习摘录021:——用class和sturct关键定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为pulbic,而class 的成员为private.@ 学习摘录022:——当我们在头文件中定义了const变量后,每个包含该头文件的源文件都有了自己的const 变量,其名称和值一样。
@ 学习摘录023:——避免多重包含,为了避免多重包含,避免名字冲突,预处理器变量经常用全大写字母表示。
#ifndef ABC_H#define ABC_H // Definition of ABC class and related functions goes here#endif摘录有想023:——看了这么多书,这么多个例子,终于知道为什么它总是用大写来表示了。
《C++ Primer》第03章学习笔记第03章:标准库类型C++还定义了一个内容丰富的抽象数据类型标准库,其中最重要的标准库类型是string和vector,它们分别定义了大小可变的字符串和集合。
另一种标准库类型bitset提供了一种抽象方法来操作位集合。
第一节:命名空间using声明@ 学习摘录024:——一旦使用了using声明,我们就可以直接引用名字,而不需要再引用该名字的命名空间:——// using declaration states our intent to use these names from the namespace std.——using std::cin;——using std::string;@ 学习摘录025:——如果在头文件中放置using声明,就相当于在包含该文件的每个程序中都放置了同一个using声明,不论该程序是否需要using声明。
摘录有想025:——我想这相当于全局变量跟局部变量的作用吧。
@ 学习摘录026:——通常头文件中应该只定义确实必要的东西。
请养成这个习惯。
摘录有想026:——书上建议少用using namespace std 这样的风格,以后写程序就尽量用using声明吧,少用using编译指令。
第二节:标准库string类型@ 学习摘录027:string操作——s.empty() // 检查字符是否为空,bool类型——s.size(); // 返回s中字符的个数——s[n]; //返回s中位置为n的字符,位置从0开始计数摘录有想027:——以前还不知道原来有empty()这一操作,初见empty还以为要清空这个对象的数据呢,其实不然,是检查字符串是否为空。