C++学习笔记第一篇,入门篇。
目录
1.数据结构中可能会用到的C++的知识:
1.1 输入输出换行等基础操作:
#include<iostream>
: 标准输入输出库。- using namespace std :namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。
命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。
此标识符作为此组群的名字。 - 输入,cin,用来分隔对象的标识符是 >>
- 输出,cout,用来分隔对象的标识符是 <<
- 换行可以在字符串""中继续用'\n',也可以用特殊的 endl 但要注意end1是一个独立存在
要用 << 来使用就像这样: <<endl
1.2一些其他特别的操作:
1.2.1 C++语法中有 引用 的用法:
- 在C++中为变量建立一个引用,就相当于为变量建立了一个别名,可以把引用看成固定永久指向某一个对象的指针。
- 引用的声明必须初始化,并且引用一旦初始化就无法再次赋值。
- 并且引用不是变量,所以编译器不会为引用分配存储空间。
- 以下是一个可以解释引用的效果的例子:
代码块如下:
//这是没用使用引用的交换函数
void Swag1(int x, int y)
{
int temp;
temp = y;
y = x;
x = temp;
}
//这是使用引用的交换函数
void Swag2(int &x, int &y)
{
int temp;
temp = y;
y = x;
x = temp;
}
int main()
{
int a = 11;
int b = 12;
cout << "a=" << a << " , b=" << b << endl;
Swag1(a, b);
cout << "这是Swag1的作用效果:" << "a=" << a << " , b=" << b << endl;
Swag2(a, b);
cout << "这是Swag2的作用效果:" << "a=" << a << " , b=" << b << endl;
return 0;
}
- 通过这个例子还可以知道,引用的初始化还可以用在传参上,如果形参是引用的话,那函数中的局部变量的操作将
被视为是对引用的操作而操作的结果会直接作用到引用所对应的对象变量上,有点像用指针充当形参的效果。 - 引用和指针的区别:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
- 引用可以实现函数中返回多个返回值,只要将需要返回的参数的形参设置为引用就行,效果和指针是一样的,
同理和指针一样,使用引用作为形参的话,传的也是地址,并且操作会影响到实参,对于内容比较大的对象,传
引用可以节省空间,提高传递效率。
1.2.2 C++语法中 特殊的开拓动态内存(new) 的用法:
-
一个比较特殊的例子: int* a = new int(10);以此来开辟动态空间的话,可以整型指针变量地址所指向的内容进行赋予初始值10。
简单的来说 "()" 和 "{}" 在 new 的使用中,可以用来赋变量或数组的初值,而 "[]" 则是用来开拓数组。- 其中如果使用了 "{}",那除了在大口号内给出的值会对应地进行初始化之外,数组中其他的数都会被默认设置成0,所以"{0}"有将全部的元素归零的效果。
- 其中如果使用了 "{}",那除了在大口号内给出的值会对应地进行初始化之外,数组中其他的数都会被默认设置成0,所以"{0}"有将全部的元素归零的效果。
-
没有进行初始化的数组,所有的元素都会被系统随机赋予一个随机数。
-
相比于malloc是 void* 无信息类型,需要强制信息类型转换,而new申请到的内存是带有信息类型的,不需要强制转换。
-
如果内存分配失败,new会返回NULL,所以可以用检查Ptr是不是NULL来检验是否申请内存成功。
-
在C语言中,malloc需要用free来释放内存,在C++中同样也需要释放内存,那就是使用delete来释放内存,使用方法和free类似,
因此切记在C++中new和delete要同时使用,就像在C语言中的malloc和free一样。 -
C++中,可以用new[]来申请数组效果的内存,如:int* arr = new int[10];就是申请了10个整型变量的内存,相当于申请了数组
长度为10的一个整型数组;不过要注意的是,此时对内存的释放就不能单单使用delete
了,而应该使用delete[]
。 -
C++中要复杂化考虑对每一个数组值进行初始化的动态开辟内存空间的方法:
-
delete
和delete[]
的区别:- 后者会调用n次析构函数而前者只会调用一次,这是最本质的区别。
- 需要记住的知识点是,如果是像int这种基础数据类型的话,那只需要析构一次,但是如果是用结构体或者共同体自定义的数据类型则需要多次析构。
- 所以一般来说,当new中的数据类型是基础类型时,那无论是使用
delete
还是使用delete[]
都能够进行内存的释放,但是如果对象是自定义的数据类型的话,
那就一定要使用delete[]
才能完全释放内存!
1.2.3 C++语法中 指针特殊 的用法:
- C++中的指针可以指向函数:
- 首先是定义一个这样的函数指针变量:假设有一个如此声明的函数:
int add (int x,int y);
那要定义一个针对它的指针变量就应该如此定义:int(*addPtr)(int,int);
- 函数指针的类型要和原函数返回的数据类型相同;
- 指针变量名前要加上 * 并且一定要记得加上括号;
- 后面还要跟上一个括号,记得表示出形参的数据类型。
- 和其他指针一样函数指针在使用之前,也必须要先指向某一个函数,否者就会成为野指针! 操作如此:addPtr = add;
- 同时应该清楚,在调用的时候一定要记得加上(*addPtr),想到指针就要想到地址,想到地址就要想要 * 来取地址的内容!
- 函数指针在调用的时候,对形参的处理和普通的函数调用的情况相同。
- 首先是定义一个这样的函数指针变量:假设有一个如此声明的函数:
1.2.4 C++语法中 特殊的数据类型 的用法:
1.2.4.1 C++中的bool型:
- 取值只有false和true,其实可以把它理解成我们在C语言中用的用来控制一些分支条件或者循环条件的flag变量,只不过现在整理出一种数据类型用来特别区分而已。
1.2.4.2 C++中的string型:
- C++中有专属的字符串数据类型,不过使用前要加上头文件
: #include<string>
- 与C不同,C语言中是用字符数组来实现字符串的模拟代替,其中显著的标志是以'\0'结尾,但是要切记的是在C++中字符串不以'\0'结尾。
- C++中字符串的相加就类似于C语言中的strcat函数,会实现首尾直接相加:
- C++中的比较大小的效果可以参照C语言中的strcmp函数来类比。
- C++中的string类型我们可以注意到它的颜色是墨绿色的,可以推断它有点像使用结构体来自定义的一个想要达到我们想要的功能的数据类型,所以它本身是存在一些类似成员的效果的存在。
- 比如此时不需要strlen函数也可以直接知道字符串的长度:
- 所以这里存在可拓展项:要想更好的利用好强大的string数据类型,去研究一下它的成员函数是很有必要的一件事情!
- 比如此时不需要strlen函数也可以直接知道字符串的长度:
- 同时要知道,对字符串的处理手段,在C语言中我们很熟悉的数组操作法在C++中也是可以通用的:
- 遍历字符串:
for (int i = 0; i < str.length() ; i++) { //这里可以一个一个字符的对字符串进行操作 //同时毋庸置疑的是我们依旧可以用字符数组的方式来访问字符串中的字符:str[0]依旧表示字符串的第一个字符。 }
- 遍历字符串:
- 字符串的输入函数:getline(cin,str)//可以从控制台输入一串字符串:
- 这里输入的字符串可以包含空格字符,只有当输入回车才会结束一串字符串的输入。
- 使用 getline()进行读取的时候,最后读取到的字符串尾部会默认有一个换行符,这个换行符可以被输出。
- 使用 getline()进行读取的时候,可以指定一个读取的结束标识符按这个格式 getline(cin,str,'用户给定的结束符号');
按这样的格式的话,str会不断读取信息直到读到'用户给定的结束符号'为止,并且它对不同行的处理方式是,将换行符吸收进来;
读入结束后默认多加一个换行符作为输入到str中。 - 使用字符串数据类型能够让我们在结构体中对字符串的使用更加的自由,并且可以提高代码的稳定性,
毕竟不用在担心字符串超出字符数组的长度而导致程序崩溃这种问题其实也是一件不错的事情。(狗头保命)