C++基础指令

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不会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值