一.引用
引用,就是为变量取了另一个名字(别名),一般用地址符&表示。在这种情况下,别名和原名看作是同一个变量,而且他们是占用同一块内存,格式如下:
int main()
{
int value = 10;//定义引用必须要初始化
int& refval = value;
return 0;
}
在这里&就不再是求地址运算符,而是作为引用的标识作用。
另一种用法。通过引用改变外界值
void func(int& ta, int& tb)
{
ta = 13;
tb = 14;
}
int main()
{
int a = 3;
int b = 4;
cout << a << endl;
cout << b << endl;
func(a, b);
cout << a << endl;
cout << b << endl;
return 0;
}
二.常量
不变的量就是常量,关键字const,不变的意思;

编辑
添加图片注释,不超过 140 字(可选)
无法改变,编译器会报错;
实际上,也有一些方法可以改变,但是不建议,如下:(刚开始学习,能不改就不改,会有很多错误)
const int var = 7;//保证这个定义值,不会被改变(有了名字的变量)
int& var2 = (int&)var;//强制引用
var2 = 18;
.另一个constexper,也是常量关键字,在编译的时候求值,可以提升性能。
constexpr int var = 3;
int &var2 = (int &)var;
var2 = 7;
cout << var << endl;
cout << var2<< endl;
.这样可以改,但是不建议。
三.范围for语句
主要用于遍历一个序列;
int v[]{ 1,2,3,45,555,66 };
for (auto &x : v)//x作为变量依次遍历数组v中的数据
{
cout << x << endl;
}
这里用x引用代表v,可以节省内存空间,提升效率;
四.动态的内存分配问题
在C中,供程序使用的存储空间,有程序区,静态存储区和动态存储区
在C++中,我们把内存分为五个部分:
1.栈,主要用来存放函数内的局部变量,例如:
void func()
{
int abc;
}
其中abc,就是函数内的局部变量,这一部分有编译器自动分配和释放。
2.堆,由程序员决定释放,其中有malloc/new存储,由free/delete释放。
3.全局/静态存储区:全局变量和静态变量放这里,程序结束由系统释放;
4.常量存储区;
5.程序代码区;
栈和堆的区别:
栈,系统分配用于存放局部变量,好处是分配速度快,但是空间有限,程序员控制不了;
堆,理论上物理硬盘有多大,就可以有多大的内存,好处是灵活,可以程序员手动分配,手动释放,缺点肯定比栈的分配速度慢;用new分配,delete删除。
new和delete在C++中,是标识符而不是运算符,使用格式如下:
第一种:指针变量名=new 类型标识符
int* myint = new int;
if (myint != NULL)
{
*myint = 8;//指针指向的变量
cout << *myint << endl;
delete(myint);//释放空间
}
第二种:指针类型名=new 类型标识符(初始值)
int* myint = new int(18);
if (myint != NULL)
{
//*myint = 8;//指针指向的变量
cout << *myint << endl;
delete(myint);//释放空间
}
第三种:指针类型名=new 类型标识符[]//分配一个数组
int* pa = new int[100];//开辟了一个大小为100的数组
if (pa != NULL)
{
int* q = pa;
*q++ = 12;//第一个元素
*q++ = 18;//第二个元素
cout <<*pa << endl;//12
cout << *(pa+1)<< endl;//18
delete [] pa;//释放空间
}
.在这里中括号必须配对使用。
五.nullptr
代表空指针,等价于NULL。引入nullptr主要是为了避免NULL和整形0的混肴,在使用跟指针有关的场合中,能用nullptr,就全部使用nullptr,而不使用NULL.
六。函数回顾和后置返回类型
把函数返回类型放到函数名字之前,叫做前置返回类型;
//函数声明时,只有形参类型,没有形参名
void func123(int , int);//函数声明加分号
void func123(int a,int)//这里后者可以不给名字
{
return;
}
int main()
{
func123(12, 13);//但是在这里调用的时候,还是需要给值
return 0;
}
在C++11中,引入另一种后置返回类型,就是在函数声明和函数定义中,返回类型在参数列表之后
auto func(int a, int b) -> void;//函数声明
auto func(int a, int b) -> void//函数定义
{
}
七.内联函数
inline int myfunc(int testv)//在函数定义前加inline就变成了内联函数
{
return 1;
}
.内联函数主要解决一个问题,对于一个被频繁调用的函数,并且函数本身很小,因为频繁调用函数会消耗资源,因此我们引入内联函数的概念;
主要方法是,在编译阶段,编译器通过把调用函数的操作替代为函数本身。
而且内联函数定义都要放在头文件中
//#define 宏展开
八.函数杂合用法总结
第一种:void表示函数不返回任何类型,但是可以使用一种函数调用,把void作为一个返回值。
void funca()
{
}
void funcb()
{
return funca();
}
第二种:在C++中函数允许同名,但是形参列表必须有明显的区别
九.const char *,char const*p,char * const p三者的区别
第一种,const在前,const chat*p
char str[] = "I LOVE CHINA";
const char* p;//p指向的东西不能通过p来修改,但是可以通过其他手段来修改
p = str;
//*p = "Y";
p++;
p++;
str[0] = 'Y';
第二种,const在中间,char const *p
等价于const char * p;
char str[] = "I LOVE CHINA";
char const * p;//p指向的东西不能通过p来修改,但是可以通过其他手段来修改
p = str;
//*p = "Y";
p++;
p++;
str[0] = 'Y';
return 0;
第三种const在最后,char * const p
char str[] = "I LOVE YOU";
char* const p = str;//表示指向只能指向p,但是指向的内容可以更改
*p = 'y';
其他的用法
int i = 100;
const int& a = i;//表示i的内容,无法通过a 来修改
.
const int& b = 31;//b和31绑定,无法修改
cout << b << endl;
十.函数形参中带const
struct student
{
int num;
};
void fs(const student& stu)//一定要学习这种方法,在形参中加入cosnt,这样可以避免其中内容被修改
{
//stu.num = 1010;
}
int main()
{
student abc;
abc.num = 100;
fs(abc);
cout << abc.num << endl;
这些写得好处:
首先,可以防止我们在无意间改变形参内容,导致实参在无意中修改;
其次,最大的好处的可以让实参更加的灵活。