c++ primer plus 第6版
源代码 ---编译器---目标代码---连接程序(启动代码--库代码)---可执行代码
源代码扩展名:c cc cxx C cpp c++
编译和链接:unix CC **.c ------》**.o -----》a.out
linux g++ **.cxx 需要链接库时的命令:g++ **.cxx -lg++;多个文件的编译 g++ 1.cxx 2.cxx中如果修改了1.cxx则编译时需要的命令
g++ 1.cxx 2.o 将重新编译的1.o与2.o重新链接。
参照linux或unix 中man帮助 编译器的命令手册
当ide中执行完程序后马上 关闭窗口,可以在程序源代码的后面加上
cin.get();\\加入状态 读取下一次键击 等待 直到按下enter按键
cin.get();
return 0;
第2章
1.区分大小写
2. #include <iostream> 添加的预处理的文件
using namespace std;
cout<< endl; 开始一个新行
3.在return 之前 加上cin.get(); 一致开着窗口不关闭
4.预处理器编译指令#include
5.编译指令 using namespace
6.函数头部 c++使用 int mian (void)这种用法 void 指出不接受任何参数
7.注释 //单行 多行用/* */
8.预编译 将#后面的命令 预编译 例如iostream 将ioistream的内容编译后替换#后面的内容 与编写大代码文件组合成一个复合文件。
9.上面iostream 如果在c中需要有.h的后缀 但是在c++ 中如果使用c中的老式头文件 仍然可以使用.h的扩展名 但是有些文件都去掉了.h扩展名 并且在文件名称的前面加上前缀c 表示来自c语言的头文件库。例如c++中使用math.h为cmath 这种变化对包含命名空间有用。
10名称空间
如果使用iostream 而不是iostream.h 则应该使用命名空间编译指令来使用iostream中的定义对程序可用 using namespace std;
这叫using编译指令 名称空间主要用来在大程序中将多个厂商的现有代码组合时,来组织程序。
大概的意思就是 a公司的代码 wo()函数 和b公司的代码中的wo() 函数,这两个函数同时封装到一个叫做名称空间的单元中,此时a公司的wo()函数在空间中被标记为a::wo() 而b公司的代码为b::wo(); 以此来区分不同的函数或者版本
仅仅当头文件中没有.h的时候 才是上面的情况
按照c++的标准组件,他们都被放置到名称空间std中。 所以调用的时候通常是std::cout std::endl
可以省略掉using
即 std:: cout<<*******
std::cout<<std::endl;
这样用起来比较繁琐 所以使用using namespace std 即可 ,而不必使用std::前缀
using编译指令使得std 名称空间中的所有名称都可用。
当然严谨一些 只使用所需的名称即可。用using声明来实现
using std::cout 仅仅使用cout即可 而不必使用std::cout
using std::endl
using std::cin
11. cout 的输出
<< 表示将后面的双引号中的字符串发送给cout函数
cout对象表示输出流 (程序中流出的一些列字符),其属性是在iostream文件中的定义的。cout的对象属性包括一个插入运算符 << ,它可以将其右侧的信息插入到流中。
例如 cout<<"fuck"; 理解为将字符串fuck 插入到输出流中。
12.运算符的重载
以上面的<<为例 在c中 此符为左移运算符 << 在c++中则是左移运算符 此为运算符重载 导致的不同的运算符有不同的含义。
c本身也有运算符重载的情况 &即表示地址运算符 也表示按位and的运算符
*既表示乘法 有表示指针解除引用 编译器如何判断意义呢:答案就是根据上下文的含义来确定。
1.endl 重启一行 导致屏幕的光标移动到下一行的开头。
例如endl的一些对于cout来说有特殊含义的特殊符号被称为控制符。 在iostream中定义 且位于名称空间std中
如果没有换行符 则下一个cout的字符串的输出会紧跟在上一个cout的输出的末尾。
2.换行符
c中的旧式 换行符号 \n
cout<<"*****\n"; 此为换行符
\n和endl的区别:endl 可以确保程序继续运行前刷新输出 即在屏幕上立即显示
\n则不能如此
有时候 在有些系统中 在您输入信息后才会出现提示
13 c++ 源代码的格式化
以分号分割每一条语句 而不是回车符或其他符号
1.代码中的标记和空白
一行代码中不可分割的元素叫做标记 多个标记用空格 制表符或回车分开,这些都称为空白
括号和逗号等不需要空白分开。
14.c++语句
c++程序是一组函数 每个函数又是一组语句。
声明语句创建变量
赋值语句给该变量提供一个值。
1.声明语句和变量
指出信息的存储位置和所需要的内存空间 使用声明语句来指出存储类型并提供位置标签。
int carrots;
指出空间为一个整数的存储空间 和编译器负责分配一个整数大小的内存空间给变量carrots这个变量并标记。
c++可以在首次使用变量之前声明 ,不必非在程序的开始部分声明,当然在开始位置声明更好。
2.赋值语句
将数值赋值给内存单元
c++的特性和c不同的地方 可以连续使用赋值运算符 例如 : a=b=c=3;
赋值从右向左进行。首先3给c c给b b的值再给a
3.cout的新花样
cout <<a; 如果a的值为1 则 输出值为1
做了两步 1.cout先将a的值替换为当前的值1 2.将数值1转换为何时的字符输出
cout 可以用于数值和字符串
如果定义字符串“25” 则字符串存储的是书写该数字时使用的字符。即字符3和8 程序的内部存储的是字符3和字符8的编码 如果要打印字符串,则cout仅仅打印各个字符即可。
如果定义的数值是整数25 则将25转换为二进制数存储在内存单元中。 打印之前cout需要将整数形式的数字转换为字符形式的数字再打印 例如itoa()函数的功能 atoi()的功能是将asc码转换为对应的数字。
cout 后面的<<插入运算符将根据其后的数据类型相应地调整其行为。运算符重载。
cout 可以扩展 extensible 用户可以自定义<<的运算符,,使其能够识别和显示所开发的新的数据类型。
15.其他的c++语句
cin 与cout对应的 要求输入的对象
cin>>a;
将键盘输入的值赋值为a
如果程序中要求添加cin.get() 则需要添加两条这样的语句 cin.get();
第一条获取数值 第二条让程序停止 直到输入enter键
cout<<"now you have"<<a<<"adsjfo0uo"<<endl;
组合输出
15.1 使用cin
将键盘上的值赋给变量a
cin>>a;
信息从cin流向a c++将输入看做是流入程序的字符流。
iostream 文件将cin定义为一个表示这种流的对象。输入时,cin使用>>运算符从输入流中抽取字符,通常需要在运算符右侧提供一个变量,以接受 抽取的信息(符号<<和》》被选择用来指示信息流的方向。)
cin也是智能对象 如果a 为整形变量 则输入的就被cin转换为计算机用来存储整数的数字形式。
15.2 cout进行拼接 cout<<a<<b<<c; 拼接 输出
也可以cout <<a;
<<b;
<<c;
15.3类简介
类为用户定义的一种数据类型 oop对象编程。
cout 和cin 是一个ostream类对象 此类(iostream文件的另一个成员)描述了ostream对象表示的数据以及可以对它执行的操作,如将数字或字符串插入到输出流中。同样cin是一个istream类的对象,在iostream中定义。
像函数来自于函数库 类也可以来自类库 ostream和istream类就属于这种情况。这些类并没有内置到c++语言中,而是语言标准指定的类。这些类定义位于iostream文件中。没有被内置到编译器中。多数实现都在软件包中提供了其他类的定义。事实上 c++的优势就是由于存在大量支持 unix winodws 和mac编程的类库。
要对特定对象执行这些允许的操作,需要给该对象发送一条消息,例如告诉cout对象 要显示一个字符串
传递消息的方式:1是使用类方法 实际上就是函数调用 2是重新定义运算符。
cout<<"fuck"; 就是使用了第2种方法。
16 函数
函数分两种 有返回值 和无返回值
1.有返回值
使用函数之前 编译器需要知道函数的参数类型和返回值得类型
c++ 程序应当为程序中使用的每个函数提供原型
函数原型对于函数 就像变量声明对于变量 指出涉及的类型 仅仅描述函数接口 并非函数定义(描述函数的实现的代码)
例如 函数sqrt函数定义为可能带小数部分的数字 并返回一个相同类型的数字,c++将这种类型称为double
原型为 double sqrt(double);
第一个double 指出返回值的类型 括号中的指出参数的类型 上面带有分号 所以说明是一个原型 而不是函数头
如果是函数头 没有分号 则编译器就会将其解释为一个函数头 并要求提供定义该函数的函数体。
使用sqrt()时 需要提供原型
两种方法: 在源代码文件中输入函数原型
包含头文件 cmath (即c中的math.h) 其中定义了函数的原型 推荐此方法
库文件包含函数的编译代码 而头文件中包含了原型
如果是老式的编译器 需要使用math.h 而不是cmath
库函数的使用
c++库函数存储在库文件中 使用时 需要在库文件中搜索您使用的函数 如果提示一个没有定义的外部函数 则有可能是编译器不能自动搜索函数所在的库。
如果出现这种情况 在unix中 则需要使用-lm选项 以搜索 CC sqrt.C -lm
在linux中 g++ sqrt.C -lm
只包含头文件 仅可提供原型,但是不一定会导致编译器搜索正确的库文件
type-name variable-name;
double类型使得变量area和side能够存储带小数的值
函数变体
多个参数 answer=pow(5.0,8.0);
无参数 myguess=rand();rand 不接受任何参数
无返回值 void bucks(double); 所有此函数不能用于赋值语句的右侧 或其他表达式中
用户定义的函数
函数原型放到main函数之前 源代码放在main函数的后面
函数的格式
type functionname(argumentlist) 此为函数头
{
statements 此为函数体
}
用户定义的有返回值的函数
通常在一个简单敞亮的地方 都可以使用一个返回值类型与该常亮相同的函数
例如int aunt=stonetolb(10);
int aounts=aunt+stonetolb(10);
cout<<"adsfasdf"<<stonetolb(16)<<"adsf"<<endl;
总结 函数原型描述了函数的接口,即函数如何与程序的其他部分交互
参数列表指出何种信息被传递给函数
函数类型 指出返回值的类型
见上图。
程序案例
#include <iostream>
int stonetolb(int);
int main()
{
using namespace std;
int stone;
cout<<"adsfasdf";
cin>>stone;
int pounds=stonetolb(stone);
cout<<stone<<"stone=";
cout<<pounds<<"pounds."<<endl;
return 0;
}
int stonetolib(int sts)
{
return 14*sts;
/*
int pounds=14*sts;
return pounds;
*/
}
stonetolb() 包含全部的函数特性
有函数头和函数体
接受一个参数
返回一个值
需要一个原型
在多函数程序中使用using编译指令
using namespace std
因为每个函数都使用cout 所以需要能够访问位于名称空间std中的cout定义
using编译指令可以位于函数的外部 也可以位于函数的内部
例如 1. 所有函数都需要访问std 空间
所以using编译指令需要在所有函数的外面
#include <iostream>
using namespace std; //编译指令
void A(int);//A函数的原型
int B(int);//B函数的原型
int main()
{ cout<<"adsfasdf"; //使用std命名空间中的cout
}
void A(int n){ cout<<"adsflkajsljll!";} A函数头和函数体
INT B(int n){ cout <<"adsfadsf";}
2.