文章目录
预处理
比如
#include<iostream>
实际上就是将iostream文件中所有内容拷贝到这个文件中
operator实际上是种函数
比如
cout<<"hello world"<<"\n";
其实就是
cout.print("hello world").print("\n");
Header头文件相关
include指令实际上就是将另一个文件中的代码复制粘贴到当下文件中,如果出现同一文件被多次复制的情况,可能会导致重复而出错,解决方案
#pragma once
放置到.cpp文件头部,或者使用ifndef endif区域块
#ifndef _LOG_H
#define _LOG_H
//写相关代码操作
#endif
通过有无拓展名判断是C的库还是C++的库
C的库都有拓展名
C++没有
可以通过if语句判断指针是否为空指针
实际上没有else if
只是else和if两个连在一起写了而已,相当于else下添加了if语句
for循环语句格式理解
for(语句1;语句2;语句3){}
语句1是指:循环开始前进行的数据初始化
语句2是指:循环的判断条件
语句3是指:每次循环结束后进行的操作
所以for语句也可以有以下两种写法形式,作用相同
for(int i=0;i<5;i++){
cout<<"I love cta"<<endl;
}
//----------------------也可写成
int i=0;
for(;i<5;){
cout<<"I love cta"<<endl;
i++;
}
所以for后的括号中可以只有一个判断语句,甚至可以直接写成一个bool型变量,然后在满足一定条件后在循环中将其bool值改变
由此看出,实际上for和while循环实际上是相同的,只是写法不同
void pointer指针
意思是:我只需要一个存放地址的指针,现在并不在乎它指向的数据类型是什么
void* ptr=0;
注意:没有地址为0,所以上行代码等同于
void *ptr=NULL;
这其中的NULL实际上就是一个预处理的符号,它的预处理代码是:
#define NULL 0
#define NULL ((void*)0)
VS骚操作——看内存的方式
需要在设置断点进行运行后才能看内存(动一下脑子就知道不运行怎么会占内存)
断点运行下:Debug(调试)->Windows(窗口)->Memory(内存)->memory 1
可以看到当下运行状态中内存中的存储状态
++和* 操作符的优先级关系
因为++的优先级高,所以如果想通过指针并用++对数据进行修改,需要加上()
int a=8;
int* ptr=&a;
(*ptr)++;
cout<<*ptr<<endl;
如果不加那个括号,会发生ptr指向的地址+1,不再指向a的地址
地址作为形参的函数
用引用往往比指针看起来更nice
引用的注意事项
引用并不是一个变量,不单独占用内存
所以声明时必须进行初始化,而且一旦初始化就不能进行更改
函数写在类中
可以减少一个参数(类的对象的引用)
STRUCTS和CLASSES的区别
只有一个区别,struct默认成员是public,class默认成员是private
struct里面成员也可以是函数,其中的成员一样可以用private,protected,public关键字进行权限限定。
他也同样可以进行继承……
之所以C++中仍存在struct,是因为要保持和C语言的兼容性
但是通常情况下,如果涉及到继承,一般用class而不用struct
static关键字的作用
static关键字作用1:数据存放在静态变量区,如果当其存在于类中时,任意一个对象的修改,都会使这个类的所有对象的对应值都改变
static关键字作用2:在linking阶段,static后的变量或函数,只在当下编译单元中声明。
就是linker不会在当下编译单元外去寻找它的定义,linker也不能从其他编译单元中读取到这个对象
它对cpp文件的作用类似于private对于类的作用
extern关键字的作用
linker会在其他编译单元中去寻找当下声明的定义(外部链接)
进制前缀
二进制 0b
八进制 0
十六进制0x
循环语句直接加了分号
for语句和while语句不能直接跟;,不然会产生错误
例如
/*------------------例1--------------*/
int i=0;
while(i<1);
i++;
printf("%d",i);
/*------------------例2--------------*/
for(int i=0;i<1;i++);
printf("%d",i);
这两段语句,均因为多添加了;,导致无法正常运行
直接跟上一个分号相当于循环体中的语句为空。
toupper()函数和tolower()函数
返回值均为int型,直接输出不是字母
scanf函数的用法
float t;
int n;
scanf("%f%d",&t,&n);
sizeof(string)的问题
在不同编译器中值不同,但是同一编译器中不变
所以不能用sizeof获得字符串的长度