c++基础语法
编程快捷操作使用方法
反汇编: 先设置一个断点,调试后,在调试菜单中选择窗口,选择反汇编
**单词替换:**先按下ctrl+f查找,再替换
基础知识辨析
1.数组指针 int (*ptest)[5] {} //该指针可以处理每行有5个元素的数组;
2.指针数组 int* ptestA[5] //包含5个指针的数组
3.动态分配内存中
如果需要分配内存,在c中有以下几种
1.void* malloc(n*sizeof(int))
eg:int* p = (int*)malloc(10*sizeof(int));
2.void* calloc(x*sizeof(int)) 同1的区别就是会将分配的内存单元全部设为0
3.void* realloc(void*,int),适用于重新分配内存,重新分配后的内存数据不丢失,但是地址变化
eg:int* pa = (int*)malloc(4);
pa=(int*)realloc(pa,8);
4.void free(void* Block) 释放内存
free(pa);p = 0;
5.c++内存动态分配
int* p, * pm;
p = new int;
p[100] = 50;
pm = new int[x];
delete p;
delete[] pm;
6.复制内存
void* memcpy(void* 要复制的对象,void* 复制到哪儿,int size字节);
void* memset(void* Des,int val,size_t Size)
eg:memset(p, 0,100*sizeof(int));
4.引用
int a =10;
int b=10;
int& pa = a; /注意引用指向是不可以换变量的,只能指向a
pa = b ;/该操作是让a=b;
5.堆和栈: 堆是空闲内存,栈是程序在编译的时候就已经确定了大小的一段内存区域,效率要高于堆,但是容量有限
6.智能指针: std::unique_ptr是智能指针的一种,目的是为了解决原生指针安全性不足的弊端
智能指针只能指向一个内存空间,不可重复指向
声明语法:std::unique_ptr<类型> 变量名称{}
c++14以后,eg
std::unique_ptr<int[]> 变量名称 {std::make_unique<int[]> (5)} 该变量数组有5个值;
std::unique_ptr<int> 变量名称 {std::make_unique<int> (5)} /对该指针指向的值赋值为5
智能指针的方法:
reset()指令,会释放std::unique_ptr的内存空间,并且将std::unique_ptr设置为nullptr;
get(),将会返回std::unique_ptr的指针,返回的是原始(非智能)指针
release(); 将会返回std::unique_ptr的指针并且将std::unique_ptr设置为nullptr。
std::move()用于转移指针变量
eg:
std::unique_ptr<int> ptrA = std::make_unique<int>(150);
std::unique_ptr<int> ptrB;
ptrB = std::move(ptrA) ;/将ptrA转移到ptrB,此后ptrA会指向0;
7.共享智能指针: std::shared_ptr<int> ptrA{}
可以有多个std::shared_ptr指向同一地址,当最后一个指针释放后,才会释放其所占有的内存空间
生成方法,c++14后同上
std::shared_ptr<int> 变量名称 {std::make_shared<int> (5)} /对该指针指向的值赋值为5
/注意std::make_shared不支持数组,如果要用数组按下方式使用
std::shared_ptr<int[]> ptrC = new int[5]{1,2,3,4,5}
拥有方法:
long std::shared_ptr.use_count(); / 返回当前指针共有多少个对象调用
bool std::shared_ptr.unique();/返回当前是否只有一个智能指针指向该数据
bool std::shared_ptr.reset() / 将当前置nullptr,如果是最后一个,则释放内存
8.字符串
常量字符串是const char*类型
如果要在控制台输出中文字符–即 Unicode32,需要做本地化操作
#include<locale>
setlocale(LC_ALL, "chs");
9.指针和结构体
有以下代码,我们注意到如果是结构体的指针,是需要->来指向其中的元素的,只有实体才可以用.来访问
typedef struct Role {
int Hp;
int Mp;
}*PRole;
int main() {
Role user;
PRole puser = &user;
puser->Hp = 50;//指针偏移形式
user.Hp = 500;
}
编译器并不知道一个结构有多大,所以用指针的的时候,编译器只有通过该指针指向的元素离指针起始点的距离来确定该结构体元素,从下列汇编语言能看出一二
10.联合体 共享成员变量的内存
11.std::string字符串
初始化方法:
①直接用字符串初始化
②std::string 变量名称 {“字符串”, 要截取的长度};
③std::string 变量名称{“字符串”, 起始位置,要截取的长度};
④std::string 变量名称 {要复制的个数, ‘字符’};
string连接字符串
str = “hyd123”+str1;
eg:string str2 = string{"abc"}+ "1234"
string连接字符
str = str1+‘a’;
基本方法:
1.转化为字符串
std::string std::to_string(数字)
2.字符串拼接
str1 = str.append(“456”);
str1 = str.append(“456”,1);截取第一个拼接
还有一些append方法和初始化方法相同
3.截取
str1.strsub(1),从1号位置开始往后都截取
str1.strsub(1,3),/从1号位置开始,截取3个位置
4.获取长度
int length = str1.length();
5.字符串的比较除了用> = <外,还有compare,返回int类型
6.搜索:如果要找到子串的起始位置信息,需要用到find函数
7.字符串的插入操作,可以在指定位置插入字符串
8.字符串的替换操作,可以替换某个字串
9.对字符串删除子串的操作
10.字符串与数字的转化
指针与字符串的关系
字符串string 类型是从第四个字节开始存放字符串的,有以下方法
stringstream: string类型可以类似std::cout创造一个流,更方便处理字符串,
12.函数
在此先声明,对于过于基础的知识就不总结了,总结易错的点
函数的传参
对于多维数组的传参,需要这样传
对于引用的传参,和指针类似,但是需要注意不可传入空引用,必须初始化,用引用传参的目的是方便修改内存中的值,引用可以认为是弱鸡版的指针,引用可以帮助我们返回多个值。
有另外一种形式,如下图中的
可以通过typedef结构体指针来理解
c++中如果要传输默认实参,需要放到形参的最后
函数的不定参数
对于函数的不定参数的信息,后续补充
左值右值
右值:表达的是一个对象的值,无法赋值的值,例如 320+230
左值:表达的是一个对象的身份,可以进行赋值的值,或者说变量
一般的引用&是左值引用,如果要对右值进行引用,则用&&,右值引用一般是用于即将销毁的数据
函数模板
概念:用来生成函数,帮助函数重载自动生成返回值
用法: 例如,对于求平均数的函数
template <typename type1> type1 ave(type1 a,type1 b)
{
return (a+b)/2
}
该模板可以自动返回需要的值类型
int a = ave(1,2); // ave相当于 int ave(int a,int b)
下面给出一个完整的示例
#include<iostream>
template <typename type1>
type1 ave(type1 a, type1 b, type1 c) {
return (a + b + c) / 3;
}
int main() {
std::cout << ave(12.0f, 233.2f, 35.3f);
std::cout << ave(11, 33, 55);
return 0;
}
type1可以作为任何类型,数组、带指针、引用都可以,或者可以用type1* \ type1&,两种方式都可以
但是如果用type1表示指针类型会出现一个问题,就是传入的是地址,无法完成想要的结果,这时候,万一编程人员使用了指针传入,需要做一个例外处理
如下:
template<>
int* ave(int* a, int* b, int* c) {
return (*a + *b + *c) / 3;
}
记住:函数重载优先级大于函数模板
除了让编译器自动匹配,我们还可以指定函数模板的参数
比如调用ave时,使用ave<int>(192.0f,34.7f) 相当于执行 int ave(int a,int b);
对于多个不同参数的模板
函数模板也可以用于非类型的变量
如果在模板函数中需要用到数组,传递数组个数
它厉害的地方在于这里可以自己推断出数组的个数,并赋值到count
常量引用是“对const的引用”的简称,它是一种特殊的引用类型,主要用于修饰变量。常量引用所指向的对象不能被修改,即它把所指向的对象看作是常量(不一定是常量),因此不可以通过该引用来修改它所指向的对象的值。以上内容仅供参考,如需更多信息,建议查阅相关文献或咨询专业编程人员。
auto关键字:
①auto声明一个变量时,不会保留常量属性(const)。
②auto会优先推断为值类型而不是引用类型
③auto可以做函数的返回类型
函数声明和定义: 声明必须在前面(不占用内存),定义可以在后面(要分配内存),我们可以将函数的声明放在头文件里,函数的声明可以放在(其他)源文件
头文件中:#pragma once表示在单个源文件中不论调用几次,都只是调用一次,当不同头文件互相嵌套的时候不会发生错误,当编译器不支持这个语法的时候,也可以用以下代码代替
#ifndef _HEMATH_
#define _HEMATH_
头文件内容
#endif //如果已经定义了,就不会执行
extern关键字: 除了用于声明,还可以用于加入C声明C语言风格的函数(不支持重载)
static关键字: 修饰的静态变量,在不同的源文件里都是独立存在的。