std::endl的作用
1、输出换行符 \n
2、强制刷新输出缓冲区,缓冲区所有数据都被系统清除(输出缓冲区:一段内存)
cout输出的时候实际是往输出缓冲区输出内容,输出缓冲区将内容输出到屏幕的情况:
(1)缓冲区满了
(2)程序执行到main的return语句
(3)调用了std::endl强制刷新缓冲区
(4)系统不太繁忙时,系统会查看缓冲区内容,发现新内容会正常输出到屏幕
std::cout中"<<"操作符的返回值类型仍为std::cout
std::cin中">>"操作符的返回值类型仍为std::cin
auto:变量的自动类型推断
auto
可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型
声明时要赋予初值
auto
自动类型推断发生在编译期间,所以使用auto
不会造成程序效率降低
auto a = true //bool
auto b = 1 //int
auto c = 'c' //char
auto d = 1.4 //float
头文件防卫式声明
避免文件间相互引用,防止头文件的内容被重复包含
#ifndef TEST1_H_
#define TEST1_H_
程序段
#endif
引用
为变量起一个别名,一版用&
符号表示,起完别名之后,别名和变量本身可以看成同一个变量。定义引用,并不额外占用内存;定义引用时,必须初始化,并且类型要相同
int value = 10;
int &refval = value; // &再这里不是求地址运算符,只是起标识作用。
refval = 3;
cout<<value<<endl; //输出为3
如果函数的形参是引用类型,则在该函数中改变形参的值会影响到外界
#include<iostream>
using namespace std;
void func(int &a, int &b){
a = 13;
b = 14;
}
int main(int argc, char const *argv[])
{
int a=3,b=4;
cout<<a<<" "<<b<<endl;
func(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
//输出为:3 4
13 14
常量
const关键字,表示不变;
const int var = 7;
int &var2 = (int &)var;
var2 = 18;
cout << var <<" " << var2 <<endl;
//输出 7 18
const char *p
:p指向的东西不能通过p来修改,即指针可以变,指向的内容不能变。
char str[] = "I love China";
const char *p;
p = str;
*p = "Y"; // 不能修改
p++;
*p = "Y"; //不能修改
str[0] = "Y"; //可以修改
char const *
等价于const char *
。
char * const p
:p一旦指向一个东西之后就不可以指向其他,但可以修改指向的值,即指针不能变,指向的内容可以变。
char str[] = "I love China";
char * const p = str;
*p = "Y"; // 可以修改
p++; // 不能指向其他
const char * const p
:p指向的内容不能变,指针也不能变。
其他
int &b = 31; //错误用法
const int &b = 31 //正确
constexpr关键字:c++11引入,也是一个常量的概念,在编译时求值,提升性能
范围for语句
用于遍历一个序列
int v[]{12,13,14,15,16};
for(auto x:v){ //将数组v中的元素依次拷贝到x中,再打印
cout<<x<<endl;
}
*******************************************
int v[]{12,13,14,15,16};
for(auto x:v){ //省了拷贝的操作,提高了系统效率
cout<<x<<endl;
}
# 动态内存分配
c语言中程序使用的存储空间有程序区,静态存储区(全局变量),动态存储区(局部变量)。
c++中,把内存分为5个区:
(1)栈:一般函数的局部变量,由编译器自动分配释放。空间有限,分配速度快,程序员控制不了。
(2)堆:程序使用malloc/new分配,用free/delete释放。忘记释放的话,在程序执行结束后,系统自动释放。只要不超过实际拥有的物理内存,也在操作系统分配允许你能够分配的最大内存大小之内,都可以分配。分配速度比栈慢,分配回收方便
(3)全局/静态存储区:存放全局变量和静态变量,程序结束时系统释放。
(4)常量存储区:存放的是常量,是不允许修改的。
(5)程序代码区:存放程序代码。
```cpp
//malloc一般使用格式
//类型标志符 指针变量名 = (类型标志符 *)malloc(内存单元个数*类型字节数)
int *p = (int *)malloc(num*sizeof(int));
//malloc释放内存
free(p);
//new一般使用格式
//指针变量名 = new 类型标识符
//指针变量名 = new 类型标识符(初始值)
//指针变量名 = new 类型标识符[内存单元个数]
int *p = new int[num];
int *q = new int;
//new释放内存
delete[] p;
delete q;
注意事项:
1、malloc和free配对使用,new和delete配对使用。
2、free/delete不要重复调用。
nullptr
c++11中引入的关键字,代表的是空指针。
char *p = NULL; //NULL实际为0
// if(p==nullptr) 判断为真
char *q = nullptr; //空指针
// if(q==NULL) 判断为真
int *r = nullptr; //可以
int a = nullptr; //错误,a不是指针类型
int b = NULL; //可以,NULL为0
// NULL和nullptr不是同一个类型,NULL:int,nullptr:std::nullptr_t
使用nullptr可以避免整数和指针之间发生混淆,使用指针初始化时,最好是用nullptr进行初始化。
评论区