一、using namespace std
hello world代码如下
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
system("pause");
return 0;
}
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中,
使用using namespace std ,可以让C++的标准程序库的标识符(如cout、cin、endl)曝光,当作全局变量使用。
二、常量指针和指针常量
//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
const int * p1 = &a;
p1 = &b; //正确
//*p1 = 100; 报错
//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
int * const p2 = &a;
//p2 = &b; //错误
*p2 = 100; //正确
常量指针 const int * p1(const常量 int* 指针)为指向常量是指针,因此指针的指向可以改变,但是常量值无法改变;
指针常量 int * const p1(int* 指针const常量)为指针是常量,即指针本身的指向无法改变,但指向的内容可以改变,常见的指针常量是使用数组名arr,数组名的内容(arr[i])可任意改变,但无法改变数组名arr的指向。
三、内存四区
C++程序执行时,其内存模型大致分为四个区
代码区:存放代码的内存空间,由操作系统管理,只读;
全局区:存放全局变量、静态变量以及常量,程序运行结束后释放;
栈区:由编译器自动分配和释放,存放函数参数和局部变量,函数运行结束时释放;
堆区:由程序员分配和释放,若程序员不释放,则程序运行结束时由操作系统回收。
四、new操作符
C++程序中利用new 数据类型在堆区开辟空间,在任何函数内使用new都是在堆空间开辟,利用delect 指针在堆区释放空间。
单个内存空间开辟
在堆区开辟一个整形空间,并存放数值10,返回的地址信息由指针p接收;使用delete p释放p指向的内存。
int* p = new int(10);
delete p;
数组内存空间开辟
在堆区开辟10个连续单元的空间,作为数组arr[10];使用delete[] arr 释放开辟的数组。
int arr = new int[10];
delete[] arr;
五、引用
数据类型 &别名 = 原名
引用必须初始化,即定义后就要赋值原名,且只能赋值一次,后面无法修改。
引用是给变量取别名,且该改别名的值也会对原变量的值进行修改。
使用引用作为函数的引用传递可以起到修改实参的作用,且可简化指针。
viod fun (int& a, int& b)
{
}
调用 fun(a, b);
引用作为函数的返回值
返回的引用必须是函数的静态变量或者是全局变量
//返回静态变量引用
int& test02() {
static int a = 20;
return a;
}
int& b = test02();
使用引用作为返回的函数可以做左值;
test01() = 100;
a的函数test01的引用返回,所以修改的是a的值,赋值后a = 100;
C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
//发现是引用,转换为 int* const ref = &a;
void func(int& ref){
ref = 100; // ref是引用,转换为*ref = 100
}
常量引用
//int& ref = 10; 引用本身需要一个合法的内存空间,因此这行错误
//加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
const int& ref = 10;
//函数中利用常量引用防止误操作修改实参
int a = 10;
showValue(a);
//引用使用的场景,通常用来修饰形参
void showValue(const int& v) {
//v += 10;
cout << v << endl;
}
int main() {
//int& ref = 10; 引用本身需要一个合法的内存空间,因此这行错误
//加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
const int& ref = 10;
//ref = 100; //加入const后不可以修改变量
cout << ref << endl;
//函数中利用常量引用防止误操作修改实参
int a = 10;
showValue(a);
system("pause");
return 0;
}