<meta charset="utf-8">
比c语言新增bool值类型
例:c中while(false==1){
.....
}
c++中 while(flase){
.....
}
c++中变量定义:
1.复制初始化:int x = 1024;
2.直接初始化 int x(1024);
c++随用随定义
cout语法形式
cout<<x<<endl;//endl代表了回车
cout<<"x + y = "<< x+y<<endl;
cout<<"x + y ="<<x+y;
cin语法形式:
cin>>x;
cin>>x>>y;
优点:不关心占位符,不关心数据类型 不容易出现问题
第一章
1.5(c++11标准)关于c++中HelloWorld一些边边角角的东西
1. c++中的#include<iostream>(头文件的引入也可以按c的方式来写#include<cstdio>,版本不同表示方法不同,不过多解释)
iostream 其实代表了istream(输入流文件)、ostream(输出流文件)的组合。但其实中并不在于是否是输入流或者输出流,重点是流的概念,引入了流这个对象(简单可以如此理解)
2.using namespace std;
这是使用了std命名空间,就像是山东济南一样 std代表的就是山东,山东后面就可以跟济南,跟德州,跟济宁,但是不能跟杭州,因为杭州不属于济南。可能这样说好理解一点
但是问题来了,假若山东有地地方叫做济阳,湖南也有个地方叫做济阳那该怎么办呢?
好的木得着急,可以这样山东::济阳 , 湖南::济阳,
::就表示从属关系
using namespace std standard//就是使用标准的命名空间
3.大多数初学者都知道cout是输出函数,cin是输入函数,但对它实现的原理可能还是很模糊
比如:cout<<"老哥"<<endl;
这就话的简单理解就是输出一行:老哥
再深一点的理解 当我们使用cout函数的时候,就是用cout创建了一个输出流的对象(把这个对象当做一个要输出在屏幕上的必然,不知道这样说理不理解)
"<<"就是一个用于插入的插入运算符,<<后面跟的内容,就要要放到这个输出流去跟随这个流进行输出的,可以这样理解,这里的流是一定要输出的,只是把<<后面的内容插入到这个一定要输出的流中。cin>>"xxx"也可以这样理解。
4. endl和\n的区别:
endl实际上是有两个功能的 第一,碰到它换行;第二,他表示当前流的结束,就是必然要输入和输出的流结束了,要把之前的缓存的输入和输出进行输入和输出。
\n只是表示回车而已,无其他作用。
单行注释//
多行注释/* */
1.7节c++编译过程
1,编译(预处理 -> 编译 -> 目标文件)产生.o或者.obj文件
预处理:g++ -o HelloWorld.ii -E HelloWorld.cpp:将预处理产生的ii文件显示出来(.ii)
编译:g++ -o HelloWorld.s -S HelloWorld.ii :将产生的汇编文件显示出来(.s)
生成目标文件:g++ -o HelloWorld.o -c HelloWorld.s(.o)
2,目标文件跟C++的库函数相连接 -> 将源函数所用的库函数代码与目标代码进行合并->二进制机器代码。
与库函数连接生成了最终的可执行文件:
g++ -o HelloWorld.exe HelloWorld.o(.exe)
生成最终的二进制文件
第二章
2.2节指令
1,计算机的体系:冯诺依曼体系
控制计算机(计算机-xxx)
请xxx吃饭 - 发送指令给xxx
指令 - 命令
操作计算机的内存(ram,rom)
2.3节变量
内存用连续的字节组成
变量就是变量所占的内存空间
命名规则:1由字母数字下划线组成
2首字母只能下划线或者字母
3不能是关键字(保留字)
{不适用拼音,不适用单个英文单词,使用有正式含义的英文单词}
2.4节常见数据类型
数值与非数值
数值:整形+浮点型
整形(char, int 32位, short, long, longlong(c++11标 准))
浮点型(float,double,long double)
非数值(string)身份证号(string)
boolean 0或者非0
2.5数据类型小结
整形有符号版和无符号版
typedef char my_char;
自己定义字符串类型的别名
纯大写代表常量
2.6声明和使用变量
下划线命名法和骆驼命名法
注意注释写法
float:32位 显示6到7位有效数字
可以在结尾加f或者不加f都可以
double 64位
2.7课堂练习
int main()
{
double doubleNum = 100.0/3.0;
//控制cout显示精度
//1.强制以小数的方式显示
cout<<fixed;
//2.控制显示的小数位置
cout<<setprecision(2);
cout << doubleNum *1000000<< endl;
return 0;
}
一起用 cout<<fixed<<setprecision(2);
用setw()只管它后边一个数字。
[图片上传失败...(image-cb8c48-1557127460375)]
第三章
3.1回顾
double 8位
long double 16位
float 8位
float和double的精度问题 float精度有问题6
3.2
//窗口名称修改
SetConsoleTitle("实例,打印德玛西亚之力的详细信息");
cin 可以自动按照输入参数的类型截断;
3.5转义字符
string 就是字符串类型
setw(8)限定宽度,要加头文件#include<iomainip>
3.6算数运算符与表达式
3.7类型转换
原则:范围小的类型的值向范围大的类型的值进行转换
short -> int ->long -> float->double
强制类型转换
第四章
4.1
单目运算符,双目运算符
bool flag = true;
cout<<boolalpha;//打印bool的0和非0,打印成true和flase
cout<<"15>30?"<<(15>30)<<Endl;
输出:15>30?false
&&并且 ||或 !非
4.2位与size运算符
按位与& ->
按位非~ :
1,二进制取反 00000010正数
11111101负数(第一位是符号位)
2,负数二进制转化为十进制
将二进制取反 然后加1,结果变为为负数;
11111101 -> 00000010 -> 加一 11(3)-> -3;
3,按位异或 同假异真
4,左移 << :2<<3 -> 10左移三位 10000->16
右移>> 16>>2 10000右移两位100就是4;
计算2的倍数;算得极快
5,sizeof(),整型4个字节 bool一个字节 double8个字 节
4.3运算符与优先级
\0 -> 空格
switch:(){
case常量1:
语句1
break;
case常量2:
语句1
break;
case常量3:
语句1
break;
case常量4:
语句1
break;
default:0
第五章循环
第六章 循环
6.1 for循环
const 定义常量内存效率高 真*常量
实例:const int N=6;
变量不更新就容易死循环
6.3
跳出总的循环 break,只要在break在循环体内 但是continute 只是跳出当前进行的一次的循环 dowhile中使用continue则直接去执行while后面的条件(dowhile多用于)
第七章 循环进阶
7.2图形循环显示
平面图形 --2维
双循环 - 嵌套循环
打印星号矩形: .//换行和归零
1,控制行数
2,控制列数
外层循环控制行
内层循环控制列
**
打印三角形,就是讨论i和j的关系
*
***
*****
星号的规律
i j
0 0
1 2
2 4
号的规律
i j
0 2
1 1
2 0
j<=j=2-i;
*****
***
*
井号规律
i j
0 0
1 1
2 2
j<=i
星号规律
i j
0 4
1 2
2 0
j<=4-2*i
第六章 数组
6.1数组:
常用统一操作(‘z’ c++中采用整形表示java中不行)
定义:int nums【k】;
const int nums【k】;
c++数组长度可以是变量
int years[6]={52,52,5,6,52,1};
int day[]={1,52};
int day[]={};//错误
省略其实是等号===
int days[]{15,52,5};
数组排序
1冒泡循环:外层循环比较的轮数
内层循环控制次数和交换
2,选择排序:
插入:1在有序的数组中找到第一个比要插入的数字大的数
2记录这个数的下标
3从数组最后一位开始依次后移,一直移记录的下标位置
4,插入
二维数组
数组的替代品:
vector:快速的数组,容器;大小可以动态扩展;
快速索引
动态增长
插入删除数据
定义:vector<double> vec1;
vector<double> vec1(4);
vector<double> vec1(4,52);
数组必须先声明大小后使用
指针
7.1理解指针
指针是一个保存内存地址的变量
数据类型 *指针变量名
间接运算符
int num =1024;
int * ptr_num;
ptr_num = #
*ptr_num=1111;//num = 1111
找地址
char ch='a';
char *ptr_ch=&ch;
(void *)ptr_ch:是地址
空指针
不指向任何一个对象,在视图使用一个指针之前可以首先检查是否为空。
int * ptr1=nullptr;
int *ptr2 = 0;
int *ptr3 = null(#include<cstdlib>)
void * 指针:存放任意对象的地址.//用途很窄
野指针
引用-------别名
指向常量的引用是非法的但是前面加const就可以
-----间接运算符 指针用 定义使用不一样
引用时:int& num =q;
若是引用常数 const int & num =10;
一个指针4个字节
动态分配内存 new
指针的真正用处:在运行阶段分配未命名的内存以存储值
在此情况下,只能通过指针来访问内存
使用delete释放申请的内存;
int *ptr_int = new int ;//不销毁就会有内存泄漏
delete p
在栈区设了一个变量 在堆区分配了了一块int型空间
编译时--运行时
不要释放已经释放了的内存
不能释放声明变量已经分配的内存
不要创建两个指向同一块内存块的指针,可能产生误操作 delete只使用与new分配的内存
程序的内存
1,栈区-----由编译器自动分配释放,一般释放函数的参数值,局部变量的值---类似数据结构中的栈
2,堆区------由程序员自己分配释放,程序结束时可能由操作系统回收-------类似于链表
3,全局区(静态区--static)------全局变量和静态变量存储在一起,程序结束后由系统释放
4,文字常量区-----常量字符串放在这里,程序结束后由系统统一释放
5,程序代码区---存放函数的地方
二维数组指针创建
//使用指针创建二维数组
int (*p2)[3]=new int[5][3];
//使用指针创建二维数组
int (p2)[3]=new int[5][3];//二维数组降维表示(p2)表示一行
p2[3][2]=998;
for(int i=0;i<5;i++){
for(int j=0;j<3;j++){
cout<<((p2+i)+j)<<",";
}
cout<<endl;
}
cout<<&arrays[1][0]<<endl;//表示第二行第一列的元素地址
cout<<p2+1<<endl;//表示第二行第一列的元素地址
指针可以运算(++ --)变量存储地址的移动
数组是有类型的 比如int []
c++函数
内置函数
自定义函数:三要素(返回值类型,函数名,参数列表)
int sum(int,int);//函数声明
不能单独返回数组
按值传递和按地址传递
void change(num){num++;}
void change(&num){num++;}
数组做方法的参数(传递的是数组指针)
限制方法外修改数组的参数:解决方案:使用const关键字
void show(int valuesArray[],int len )
void show(const int valuesArray[],int len )
int [][5];
函数指针
函数地址:函数地址是存储其机器语言代码的内存开始地址
好处:可以在不同的时间使用不同的函数
函数原型:double sum(double,double);
double (*ptrSum)(double,double);
//定义函数指针
double(*ptr_calc)(double,double);
//定义函数指针使用方法
void print_result(double(*) (double,double),double,double);//声明
void print_result(double(*ptr_calc)(double,double),double num1,double num2){//实现
//调用函数,显示结果
double result = ptr_calc(num1,num2);
cout<<"运算结果为"<<result<<endl;
}
//使用函数指针
print_result(ptr_calc,num1,num2);
函数进阶
1,内联函数(c++提高程序运行速度所做的一项改进)
指针and引用:
引用:书写简便
直接传递对象
1,引用可以做返回类型
绝对不能返回局部变量的引用(内存会被回收)
2,函数可以不会返回值,默认返回做好一个修改的参数
3,只能返回传入的引用本身
4,传入参数和返回参数的时候加const
[图片上传失败...(image-77e9c-1557127460374)]
默认参数
使用默认参数:在函数定义或者原型中给出,不能同时给出
多个参数默认值从右向左赋值,
[图片上传失败...(image-e9ac83-1557127460374)]
重载(const 与 &不用)
函数重载:函数名相同,参数列表不同(特征值不同)
原理:编译时,根据参数列表对函数进行重命名
void swap(int a,int b)-> swap_int _int
void swap (int a,int b,int c)->swap_int _int _int
重载决议确定用哪个
函数模板
函数模板-------建立一个通用的函数
1,函数定义时不指定具体的数据类型(使用虚拟的类型代替)
2,函数调用时候编译器反推数据类型
[图片上传失败...(image-bb5ffd-1557127460374)]
显示 “ “ ”用cout <<"""<<s<<"""<<endl;