欢迎光临散文网 会员登陆 & 注册

C++学习笔记

2023-07-08 16:48 作者:-_-月下独酌-_-  | 我要投稿

最近在学c++写了点笔记经验太少因此放出来让大家批阅,欢迎有不同的意见指正,杠精退避

void数据类型主要用于描述函数的返回值类型(返回空值or不返回值)

7289=7.289*(10*3)(科学计数法)=7.289e3(计算机版科学计数法)

c++传变量入函数后,变量在函数体内改变,但操作不会保留,在函数体外变量的值不变:

int a=1;

void textText(int num){

num++;

cout<<num<<endl;

}

cout<<a<<endl;

textText(a);

cout<<textText(a)<<endl;

cout<<a<<endl;

运行结果为

2

1

1

可见变量a的值在函数体外并未改变,但在函数体内确实改变了,函数的操作并不会影响函数体外的变量,但某些情况下我们需要函数体外的变量保留传入函数体内的操作因此需要引用即:

void textText(int& num){

num++;

cout<<num<<endl;

}

引用传入的是被引用变量的内存,相当于指针,引用变量和被引用变量共享内存地址,引用变量不能直接引用常数:

int b; int& ref_b=b; 此处ref_b相当于变量b的一个别名。

const设置不可改变的常量例如:cosnt flot pi=3.1415926 此时pi不可以进行pi++自增操作,因为pi被设定为不可更改的常量const也可用于改变引用传递的参数类型如void canPastnumber(const int& num);

在此函数中若无const,传入的参数是变量,即为值的内存地址经过函数操作后传入的变量经历的操作是保存的,加上const后传入函数的参数是常数或者说是传入了值,值在经历函数的操作后是不变的,且此时此函数已经不能传递变量,只能传递常量。


函数重载

int funtion1(int a;int b);

int funtion1 (float c ,char d);

函数重载指函数名相同但传入参数不同的函数仅仅改变函数类型是没有用的如:

int funtion2();float funtion2();这两个函数声明是错误的,并不能重载


结构体与枚举类似,都是在自定义一个数据类型,但操作方式大同小异:

enum MyEnum 枚举

{

Px_Mine,

Px_Yours, 枚举所创建的数值类型为常数,默认情况下

Px_hers 遍历起始值为0【0,1,2,3,.....】

};

MyEnum plays=Px_Mine; 枚举类型调用实例;通常枚举类型与switch语句共同使用


struct position{int x;int y; int z};

struct player 结构体

 {

int level;

float heath; 在我看来结构体更像是一个箱子把需要的操作和变量封装起来方便统一调用

float damage;

position location; 在一个结构体内声明另一个结构体的变量即为嵌套

void GetDamage(float dmg,float& hp)

{

hp-=dmg

}

void GetLocation()

{cout<< location.x<<location.y<<location.z<<endl;}

};

player Nomber1;

Nomber1.level=10;调用方式1

player Nomber2={10,100.f,20.f };调用方式2,对应结构体进行初始化

Nomber1.GetDamage(damage,heath);结构体内定义函数的调用

player Nomber3={10,100.f,20.f,{0,0,0}}; 对原结构体和嵌套结构体变量进行初始化

Nomber1.GetLocation();



指针

当我们创建一个变量时内存分配给变量的空间为(例:int i=2)4 byte,每个字节(byte)有8个位(bit)。

指针变量本身是地址,可用于访问该内存的内容。当创建一个需要输入参数的函数,他的输入参数可能是

一个非常大的结构体。当我们调用函数并将结构体作为输入参数时,会复制这个结构体做为副本来初始化输入参数

当这个结构体非常大时内存的传递效率非常低会使程序运行变慢,所以需要使用指针传递该结构体的地址到函数,

这样仅仅只传递了一个地址(十六进制的数字)将会非常高效;

int* ptr; ptr=&i cout<<ptr<<endl;`0x114514` cout<<*ptr<<endl;`2`

由此可见指针的内容是一个十六进制的数字,但访问指针地址储存的内容需要*解引用,因为指针ptr本身是一个地址

需要*解引用才能访问内容。指针变量得到的是变量的地址是一个十六进制数字,当用指针变量访问一个大型结构体

的时候,这会使程序比直接调用大型结构体更加高效。

在此插入指针和引用的区别

{

引用不可为空,指针可以为空;引用不可改变指向,指针可改变指向;引用的大小是被引用变量的大小,

引用只是个别名,指针的大小是四个字节;引用可以直接访问内存内容,指针需要*解引用。

总之:指针指向一块内存,它的内容是所指内存块的地址;而引用是某块内存的别名,引用不可改变指向。

}

指针实操记录:

1.0

int main(){

int a=100;

int* aPtr;

aPtr=&a; 需要与位符引用变量a

int numbers[]={0,1,2,3,4,5,6} 创建并初始化数组

aPtr=numbers; 指针获取数组的地址值需赋值数组的名字(与获取变量地址大有不同)

for(int i=0;i<6;i++)

{

cout<<aPtr<<*aPtr<<endl; 从输出结构可知将数组地址赋予指针获取到的是第一个元素的地址(numbers[0])

aPtr++; 指针可以做自增等操作,可以用于遍历数组内的所有元素

}

}

2.0

struct position {

int x;

int y;

int z;

string name; 创建结构体

};

int main() {

position P_1 = {0,0,0,"CXK"}; 初始化结构体

position* structPtr;

structPtr = &P_1;

for (int i = 0; i < 4; i++)

{

cout << structPtr << endl; 输出值为四个十六进制内存地址

structPtr++;

}

system("pause");

} 由此可见结构体变量P_1的性质介于变量和数组之间可以进行遍历,但也需要&获取地址

同时我也进行了一些视频没有涉及到的操作并给予出基于我当前认知水平的解释

int main() {

position P_1 = {0,0,0,"CXK"};

position* structPtr;

structPtr = &P_1;

2.1//cout << structPtr << endl; 获取的是变量 P_1 首个元素的地址

2.2//cout << *structPtr << endl; 无法运行,因为P_1 里有四个元素,指针一次只能读取一个,同时结构体指针无法通过遍历获取变量P_1 的内容

2.3//cout << structPtr->name or |(*structPtr).name |<< endl; 这是结构体指针访问变量元素的方式只能一个一个访问??此次保持质疑

2.4for (int i = 0; i < 4; i++){cout << structPtr <<structPtr->name<< endl;structPtr++;} 此处运行结果为输出第一个元素的地址加第四个元素的内容换行;输出第二个元素的内容然后报错cmd运行终止。对于此处我的猜想是遍历第二次时结构体指针的地址改变为指向变量P_1的第二个元素,这使得指针不再指向变量P_1,因此遍历第二次无法获取name的值,我猜想这也许和结构体变量介于变量和数组之间的性质有关

如有正确观点欢迎指正萌新

system("pause");

}

学习于以下链接:

【【中字精译】《为游戏编程学习C++》  全网最好的C++入门教程】 https://www.bilibili.com/video/BV1Dd4y1R7VS/?share_source=copy_web&;vd_source=5c9d82b5bcf240e778cfd9337f3dfd50


C++学习笔记的评论 (共 条)

分享到微博请遵守国家法律