本文为学习C++的自学笔记,b站黑马程序员的C++教程,因为本人学过C所以基本语法没有写出,
第一次发表文章
欢迎大佬指正
下面我们先复习一下基本知识
sizeof(变量或数据类型)求变量占的字节
C++默认情况下 输出一个小数只会显示6个有效数字
C++风格字符串 string //要加头文件 include <string>
就可以创建一个字符串变量了 例 :string str = "hello world"
bool类型占一个字节
cin: 从键盘上获取数据
比较运算符号比完之后会返回真假(0\1)
三目运算符
c = (a>b ? a:b);如果a>b 返回a 反之返回b
//在c++中· 三目运算符返回的·是变量可以继续赋值
goto (C完美适用)
//goto FLAG;
//.......
//FLAG:
静态成员变量(所有对象都共享一份数据)
加一个关键字 static
在编译阶段分配内存
类内声明 类外初始化
当我们做值传递的时候形参发生改变 , 实参不会改变,所以我们想要实参也发生变化就要用到地址传递
指针前加引号表示解引用 *p
空指针给指针变量初始化
空指针是不可以访问的
//空指针就是指向编号为0的空间 因为0~255是系统占用的不可更改
int *p = NULL;
野指针就是指向非法的内存空间
所以野指针和空指针访问的都不是我们自己申请的内存空间 不要使用
const修饰指针 const int *p = &a; 就是常量指针 只能改指向 不能修改指针所指向区域的值
const修饰常量 int * const p = &a; 指针常量 只能改指向区域的值不能改方向
还可以 即修饰指针也可以修饰并且修饰常量 const int * const p = &a;
结构体属于用户自定义的数据类型 //struct Student{......}
结构体数组
struct Student atuArray[3] =
{
{"张三",18,100}
{......}
{......}
}
写好之后也可以赋值
//Student atuArray[1].name = "赵四";
结构体指针 -> 可以通过结构体访问结构体变量
结构体之间可以嵌套
const可以进行防止误操作
rand() 生成随机数的函数 rand()%100 就是生成0 - 99的随机数
但这是伪随机 要想真随机数 就是要添加一个随机数种子 //srand((unsigned int)time(NULL)); 但用这个前要包含头文件 #include<ctime>
system("pause") 请按任意键退出
system("cls") 清屏函数
内存四区每个区存放的数据,赋予不同的生命周期 给我们更大的灵活编程
代码区 :存放二进制代码 由操作系统管理的 代码区是共享的 只读的 //共享的意思是不管点开他多少次 他都只执行那里面的代码
全局区 :存放全局变量和静态变量和常量 这些生命周期不是我们所控制的 特例是局部变量和const修饰的常量
上面两个都是系统执行前就存在的
栈区:也是由编译器管理 开辟和释放 局部变量就在里面
不要返回局部变量的地址(因为栈区在函数执行后自动释放)传进函数的形参数据也会被分配到栈区
堆区:由程序员分配释放,若程序员不释放系统会帮你释放
/*在堆区开辟数据*/
new int(10); 这个会返回地址编号
我们可以用指针接收
int* p = new int(10);
释放new可以通过delete
// delete p;
//若要释放的数据为数组
//delete[] *p;
引用:给变量起别名
语法:数据类型 &别名 = 原名
//int &b = a ;
a的别名为b
!注意!
1.引用必须初始化
2.引用一旦初始化 就不可以更改了
注意 :引用的妙用也可以像指针一样可以形参去修饰实参,从而简化我们的指针(就是可以替换指针)
例如最基本的交换函数 普通我们必须要用指针进行地址传递我们的实参才会发生变化我们现在就可以用引用传递
int a = 10;
int b = 20;
swap(a,b);
void swap(int &a,int &b) //当传入参数 就为 int &a = a;a的别名为a
{
int temp = a;
a = b;
b = temp;
}
//引用有一个隐藏逻辑,函数结束导致&a !=a。所以&a实际上已经归零了,但不会导致函数外的a同步归零。
补充:上面提到我们的局部变量存放的是栈区,局部变量的值会被释放,所以我们如果返回局部变量引用的值,并用引用接收,这只能打印一次(原因就是因为函数结束导致&a!=a)。
所以不要去返回局部变量的值,
但是我们的函数引用可以作为左值
//例
int& test()
{
static int a = 10;
return a;
}
//然后可以用引用接收了;
int &temp = test();//如果函数做左值,那么必须返回引用。
//也可以直接
test() = 1000;
//这里实际上就是对静态变量(全局区:在整个程序运行完才会释放)a进行操作
究其原因就是因为静态变量本身和他的所有引用指向同一个内存空间,对变量和其任意一个引用赋值均会改变地址上的值。
引用的本质:在c++内部实现是一个指针常量。(指向不可更改也印证了为什么引用不可更改)
int& temp = a;//会被自动转化为 int* const temp = &a;
temp = 20; //内部发现ref是引用 帮我们自动转换为 *temp = 20;
至此开始C++入门