1.输入流输出流
1.1 cout
std::cout<<要输出的内容<<std::endl;
功能:将要输出的内容,按顺序输出到终端,并且可以自动识别内容类型,可以直接加强转。
::为作用域限定符,表示范围;
std:: 的含义为:使用std命名空间中的cout;
endl为换行符。
1.2 cin
cin>>要输入的内容;
功能:获取终端输入的内容,可以自动识别获取的内容类型。
注意:cin的结尾不可以加endl;
2.命名空间
2.1 命名空间作用
防止命名污染的,相当于给名字起了一个姓氏。
2.2 使用方法
方式1:每次使用时,都单独加命名空间名:: 来修饰。
std::cout<<内容<<std::endl;
方式2:可以提前使用using声明 名字来自于哪个命名空间.
using namespce std::std;
using namespace endl;
cout<<内容<<endl;
方式3:可以提前声明 使用整个命名空间中的名字,后面再使用std命名空间中的所有名字时,都可以不用加 std:: 了。
using namespace std;
cout<<内容<<endl;
2.3 自己编写命名空间
格式:
namespace 命名空间名{ 数据类型1 变量1; 数据类型2 变量2; ... 数据类型n 变量n; }
1.当多个命名空间出现重复的变量时,直接使用变量会报错,需要加上空间名。
2.与全局变量重复时,全局变量会保存再匿名空间中,可以使用::来使用。
3.与局部变量冲突时,会以局部优先。
4.命名空间中可以声明函数,也可以封装函数。
5.命名空间可以嵌套使用。
3.C++中的字符串
3.1 string
3.1.1 使用string的要求:
1.必须加头文件 #include <iostream> 以及 #include <string>
2.必须添加using namespace std;
3.1.2 string 定义以及赋值
1.只有一个变量时:
string s1; s1 = "hello";
string s2 = "beijing";
string s3("hqyj");
string s4(5, 'M'); //使用5个M来给s4初始化
2.有两个变量时:
string s5; s5 = s4;
string s6 = s1;
string s7(s2);
string s8 = s1+s2;
3.1.3 string类型使用
1.string类型可以直接使用关系运算符,不需要使用strcmp等;
2. 使用size()可以计算字符串的长度 (不包括'\0'的) ----相当于strlen();
3. empty()可以判断字符串是否为空, 返回真(空) 返回假(非空);
4.使用getline可以获取带空格的字符串:getline(cin,s);
5.string访问成员有两种方式:s[ i ],s.at( i );
4. bool类型
bool类型的变量只有两个值:true(1) false(0),0 表示假 非0表示真,true和false是常量,可以用来给bool类型的变量赋值。bool类型的大小:bool类型的大小是1个字节,本质上讲:bool类型只有两个状态,使用1个bit位就够了,但是C语言内存分配的最小单位是 字节 所以 bool 类型的大小是1个字节。
5. 引用
5.1 引用的格式及作用
格式:
数据类型 &引用名 = 引用的目标;
作用是给变量起个别名。(类型linux系统中硬链接文件):& 定义引用时,起到标识的作用,标识定义的是一个引用。
在C++中,&有三个作用:
1.定义引用时,起到标识的作用,标识定义的是一个引用;
2.在变量前加&,表示获取变量的地址;
3.在变量做运算时,表示按位与;
使用引用就可以不用考虑值传递等问题。
可以通过使用const来使用常引用,表示不能通过引用修值。
注意:
1.定义引用时,必须用引用的目标来初始化;
2.引用的类型和引用的目标的类型要保持一致;//继承和多态时除外;
3.引用的目标一旦确定,就不能再修改了;
5.2 引用指针
引用指针的格式 :
int *p = NULL;
int* &r = p;
对比C的二级指针:void compare(int **p);
而C++中只需:void compare(int * &p);
5.3 引用和指针的区别
1.引用必须初始化 指针可以不初始化
2.引用不可以改变引用的目标 指针可以改变指向
3.不存在指向NULL的引用 指针可以指向NULL
4.指针在使用前需要检查合法性 引用不需要
5.可以定义指针数组、不可以定义引用数组
int a = 10,b = 20;
int *arr[2] = {&a, &b} //正确
------------------------------------
int &arr[2] = {a, b} //错误
6.可以定义数组指针,也可以定义数组引用
int arr[2][3] = {10,20,30,40,50,60};
int (*arr_p)[3] = arr;
-----------------------------------
int arr[2] = {10,20};
int (&arr_p)[2] = arr;//引用一维数组
int arr[2][3] = {10,20,30,40,50,60};
int (&arr_p)[2][3] = arr;//引用二维数组
7.可以定义指针函数,也可以定义引用函数
int *func_p(int a, int b){}
-----------------------------------
int &func_p(int a, int b){}
8.可以定义函数指针,也可以定义函数引用
int func(int a, int b){}
int (*func_p)(int a, int b);
func_p = func;
------------------------------------
int (&func_r)(int a, int b) = func;
9.可以定义指针的指针(二级指针) 不可以定义引用的引用(二级引用)
int a = 100;
int *p = &a;
int **pp = &p;
---------------------------------
int a= 100;
int &r = a;
int &&rr = r; //错误
int &&r = 100; // 可以 叫做右值引用, 不是二级引用
C++11以上版本的编译器才支持这种用法
g++ ***.cpp -std=c++11
6. 动态内存的分配和回收
6.1 分配 new
单个空间的分配格式:
数据类型 *指针名 = new 数据类型;
如: int *p = new int; //在堆区分配1个int大小的空间
连续的空间的分配格式:
数据类型 *指针名 = new 数据类型[个数];
如:int *p = new int[5]; //在堆区分配5个int大小的空间 连续的
new在分配空间的同时可以使用()进行初始化,不填时为0。
连续空间的分配:使用()进行初始化时,需要C++11以上的版本;或者使用循环遍历的方式进行初始化。
6.2 回收 delete
单个空间的回收:
delete 指针名;
连续的空间的回收:
delete []指针名; //方括号里空 不用写内容 但是必须写[]
//表示释放从指针指向的空间开始的连续的空间
6.3 C++中 new/delete 和 malloc/free 的区别
1.new/delete是C++的关键字,malloc/free是库函数;
2.new在分配空间的同时可以进行初始化 malloc不可以;
3.new分配的空间如果没有初始化,默认会初始化成0;而malloc分配的空间如果没有初始化 里面都是随机值,需要自己手动调用memset或者bzero函数来清0;
4.new是根据类型分配的空间的,而malloc是根据字节数分配空间的,需要自己sizeof()计算;
5.new是要什么类型,返回的就是什么类型的指针,而malloc返回的都是void *,需要自己强转成需要的类型;
6.new在分配类对象空间的时候,会调用类的构造函数,malloc不会。
7.delete在释放类对象空间的时候,会调用类的析构函数,free不会。