程序设计C++前五章知识总结

新学期第一篇博客。
这学期的饭碗课是C++面向对象程序设计,这门课程是在C语言的基础又加了不少新东西。
这学期的头号是指针,指针,指向它存储的值指向的空间地址,可以把指针看做一个矢量。
C++第三章的内容基本都是上学期学习的C语言内容,当然,第三章的内容都是我闲的没事看的,但不看不知道,新东西还不少。
一、头文件用于定义整数类型数据的最大、最小值。
如int:INT_MAX最大值,INT_MIN最小值。unsigned:UINT;short:SHRT。
二、对于算数运算,总结一下经验:
整数运算优先选用int,int是机器处理效率最高的整数。数值超过int用long long,因为long与int差不多,short过于小。
2.对于非常大的整数数组,使用short定义可以节省大量空间。
3.如果只需用一个字节,可以用unsigned char。
4.算出表达式中不能使用char和bool类型的数据。
5.浮点数用double。
三、C++11新增原始字符串。R"(字符串)"。
四、整数输出格式:
noshowbase(不显示进制基数前缀)noshowpos(不显示非负值的正号)showbase(显示进制基数前缀)showpos(显示非负值的正号)dec(十进制格式)oct(八进制格式)hex(十六进制格式)
以上可以修改输入流和输出流的状态。
int n = 86;
cout<<n<<endl;
cout<<showpos<<n<<endl;//显示非负值的正号???只适用于十进制?
cout<<oct<<n<<endl;//八进制
cout<<hex<<n<<endl;//十六进制
cout<<showbase;//显示进制基数前缀
cout<<oct<<n<<endl;
cout<<hex<<n<<endl;
cout<<uppercase<<n;//???
cout<<58<<endl;
cout<<dec<<58<<endl;//回复十进制格式
输出:
86
+86
126
56
0126
0x56
0X560X3A
+58
五、C++浮点数的输出用操纵符fixed:以小数形式输出浮点数。
scientific:以科学计数法形式输出小数。
控制小数数位,用cout.precision(小数位数)
六、用cout.width(输出宽度)
cout.fill填充字符。

char a;
int n;
cin>>n;
cout.fill(’*’);
for(int i = 1;i<=n;i++)
{
cout.width(i);
cout<<n<<endl;
}
输入 5
输出
5
*5
**5
***5
****5
六、位运算符^
int x,y;
cin>>x>>y;
x = x^y;
y = x^y;
x = x^y;
cout<<x<<" "<<y;//用于实现两个值得交换,最省空间。
第四章符合类型
一、指针
定义指针:int【雪花】p;
前面的数据类型并不是指针的类型,而是指针指向的数据的类型。其中的p存放地址,使用的时候不是使用【雪花】p,而是直接用p来存放地址。
指针只能用来保存地址,也不能被赋值或初始化为不同类型的地址值。
空指针:
nullptr,用nullpt初始化或赋值给一个指针,会是指针变为控制指针。
这里的赋值给指针是成立的,不能把变量直接赋值给指针。
通用指针void【雪花】指针。可以持有任何类型的地址值。
void为无类型,void指针肯依指向任何数据,也被称为通用指针和泛指针或万能指针。在任何时候都可以指向任何类型的数据变量。使用void指针的时候需要进行强制类型转换。
void【雪花】p;
int【雪花】pa = (int【雪花】)p;
这样才能对原来的指针进行空间操作。任何类型的指针都可以赋值给void指针,无需强转。
二、new和delete管理内存
内存池:自由存储区、堆
动态内存分配:malloc()。
动态内存释放:free()。
管理: new和delete运算符用于动态分配和撤销内存的运算符。
new:开辟空间,申请内存。在堆上动态分配空间,创建对象并返回对象的地址,头文件,允许对内存进行初始化。
delete:释放空间。堆上的空间在使用后必须释放,否则会造成内存泄漏。 new定义:int 【雪花】p=new
int[100];
delete定义:delete 指针; //单个对象
或者delete [ ]指针。//定义数组。
delete后指针为悬空指针。
常见问题:
1.忘记使用释放内存。导致内存耗尽才被发现。
2.使用已经释放内存的对象。
3.同一块内存释放两次,破坏自由空间。
三、引用 左值定义:
赋值号左边,有地址、有名字的值为左值。 反之为右值。
引用 = 左值引用。
引用必须是初始化的、有内存地址的对象,不能是地址。 指针和引用有区别。
1.指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
2.引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。
3.可以有const指针,但是没有const引用。
4.引用只能是一级,指针可以有很多级。
5.引用在初始化后就不能再被改变了,而指针想怎么变就怎么变。
6.返回动态内存分配的对象或者内存必须使用指针,引用引起内存泄漏。
右值分为纯右值和将亡值两种。
纯右值:非引用返回的临时变量、运算表达式产生的临时变量、原始字面量。
将亡值:将要被移动的对象。
右值引用:
int &&r=【雪花】x;
将左值转化为右值进行右值引用:std::move(a);
四、const指针和引用
const只读属性,只使用不修改,限定常量。
指向常量的指针;指向非const对象的指针常量;指向const对象的const指针;const限定引用。
五、latile限定词
latile限定词用于限定对象,对象不能被例行优化。
对象的值可能在编译器的控制或检测之外被改变时,应该将对象声明为volatile。一般用在多线程或中断处理的程序设计中。
六、结构体
Struct 结构体类型名{
成员声明;
};
先定义结构体类型,在定义结构体变量。
结构体的成员不能独立使用,必须由结构体类型的变量通过成员选择运算符“.”选择或者由结构体类型的指针通过“->”选择。
struct 结构体名称 结构体变量1,结构体变量2;
struct 结构体名称 结构体变量3,结构体变量4;
用此结构体类型,可以定义更多的该结构体类型变量。
七、联合共用体union定义
八、枚举enum
定义一个变量是枚举类型,可以先定义一个枚举类型名,然后再说明这个变量是该枚举类型。
在限定作用域的枚举中,枚举成员的名字遵循常规的作用域准则,在作用域外是不可访问的。
在不限定作用域的枚举类型中枚举成员的作用域与枚举类型本身的作用域相同。
注意:
1、枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举元素进行赋值。
2、枚举元素作为常量,它们是有值的,
九、内置数组。
类型 数组名[数组大小];
一个数组不能被另一个数组初始化,也不能直接赋值给另一个数组。
访问数组元素:使用数组下标时,通常定义为size-t类型。在头文件中定义,表示内存中任意对象的大小。
数组与指针:使用数组的时候编译器一般会把它转换为指针。当使用数组作为一个outo变量的出始值时,得到的类型是指针而不是数组。
二维数组a[m][n]的元素a[i][j]在内存中的地址是a+(i【雪花】。
Begin(数组名);
End(数组名);取最后一个元素的下一个位置(第一个无效元素位置)。
十、 标准库类型string
表示可变长度的字符序列。
头文件
Getline()函数:在读取的字符串中保留输入时的空白符,遇到换行符为止。
判断string对象是否为空:empty();返回一个布尔值//if(!line.empty())。
获取string对象的长度:size();返回字符的个数。u
如果要定义存放string对象长度的变量,除了直接使用string::size_type类型,可以用auto或decltype推断变量类型
十一、 标准库类型vector
头文件。
Vector<元素类型>变量名;
Push_back()添加元素;pop_back()删除末尾的元素。
使用下表运算符可以获得vector中指定位置 的元素。下标类型:vector::size_type。
创建一个空的vector。复制一个vector。创建一个vector,含有n个数据,数据均已缺省构造产生。创建一个含有n个elem拷贝的vector。创建一个以[beg;end)区间的vector。销毁所有数据,释放内存。
十二、 文件读写。
使用文件流要包含头文件.
Ifstream:输入(读文件)的文件流。
Ofstream:输出(写文件)的文件流。
Fstream:把文件连接到流对象用输入和输出(读写)。
Ios::in(只读模式);ios::out(输出模式)。
第五章 函数
函数的基本形式上学期已经学过了,又学了很多新东西,复习一下以前的。
函数定义:返回类型 函数名(参数列表)
{
函数体
}
函数调用:函数名(实参列表);实参。
下面是新东西了。
一、
函数传值有三种方法:传值、传地址、传引用。
三者的区别可以通过一段代码来看。
int a = 1, b = 2;
int x = 10, y = 20;
int m = 100, n = 200;
//传指针方式调用
swap1(&a, &b)
cout << a << " " << b<<endl; // a = 2,b =1;
//传地址方法调用
swap2(x, y);
cout << x << " " << y
<< endl; // x = 20,y = 10;
//传值方式调用
swap3(m, n);
cout << m << " " << n
<< endl; // m = 100,n = 200没有交换;
//传指针
void swap1(int *a, int *b){
int t;
t = *a;
*a = *b;
*b = t;
}
//传引用
表面上,穿引用方式比传指针的方式调用简单,参数传入后使用简单。
实际上,引用被创建的同时必须被初始化,必须与合法的存储单元关联,一旦引用被初始化,就不能改变引用的关系。
二、数组参数
数组和函数作参数时,必须传指针拷贝构造函数参数传引用。
数组和函数必须使用地址来传参,没有例外。其中数组做参数是将数组第一个元素的地址传递。
如果在函数中使用数组长度,那么必须将他作为单独一个参数。
void fool(int a[],char【雪花】size);
三、 返回类型和return语句
默认情况下,函数的返回值是按值传递的。
return语句放在函数体内,束当前正在执行的函数,将控制权交给调用函数,返回函数执行结果。
返回指针或引用时,绑定内容必须是存在的,不返回局部变量。
四、函数重载
简单来说,就是名字相同,功能类似,参数不一样。重载机制允许多个函数共享一个函数名,对不同的参数类型进行不同的操作,编译器会根据参数类型自动选择。
五、静态局部变量
作用空间不大,生存周期很长,离开函数空间不起作用。
寄存器变量:
register,快,不需要内存地址,数量有限,直接操作,取地址取不出来。
静态分配:
固定的全局静态存储区,在程序执行的时候变量就占据存储空间,直到程序结束才释放内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值