引用变量:就是变量的别名,并没有开辟新的空间
形参可以使用"引用",避免赋值过程,提高程序的执行效率
格式:int&d=a,d是引用变量,a是某个变量,d是a的别名
其次 引用做为函数返回值时,也可以避免值拷贝,同时函数返回值是引用还可以作为左值使用。
函数如下
#include <iostream>
using namespace std;
int add(int* const a, int* const b)
{
//a++;
return *a + *b;
}
//永远不要返回一个局部变量的地址或引用。
static int f;
//函数形参使用引用可以避免值的拷贝,返回值使用引用,不仅可以避免值的拷贝,同样也可以作为左值使用。
int& add(int& a, int& b)
{
f = a + b;
return f;
}
int main()
{
int a = 100;
int b = 200;
add(a,b) = 3000;意思是 int&f =add(a,b) = 3000,int&f=3000;f成了3000的别名
cout << f << endl;此时f=3000;
return 0;
}
总结一下:引用与指针的一些特点区别:
1:从编译器角度来讲:
1.1:引用就是一种升级版的指针。
2:从语法形式来讲:
2.1:引用是引用的是已经存在一块合法的空间。
2.2:引用变量即是引用空间的变量的别名!!!!!!!
2.3:指针可以是一个野指针,他可以指向任何的地方。如果在C++中单纯使用指针,很容易把程序写的不堪一击。
(内存很容易被写飞!!!!所以要使用引用)
2.4:指针可以进行无限次的赋值。
2.5:引用只可以被引用一次
C++的函数重载:是一种多态机制:静态多态,也叫做编译时多态
多态:同名函数不同的实现形式
int add(int a, int b)
{
return a + b;
}
float add(float a, float b)
{
return a + b;
}
string add(string a, string b, string c)
{
return a + b + c;
}
在底层实现中是addii,addff,addnst
就是在编译时,编译器会根据函数的行参的类型,个数,顺序不同,
而生成的一个不同的函数,最终的调用还是C中的函数方式的调用。
6.1C++中函数参数默认值语法:
底层实现函数参数从右网左依次赋值,不可以跳跃
C++内联函数:
内联函数格式
lnline int add(int a,int b){
}
可以内联函数特点:1代码简短
2无循环
3无耗时操作
4无回归函数
内联函数再编译时会直接展开,而不是执行函数调用的几个阶段
函数调用阶段1实参入栈
2开辟栈帧
3返回值返回
4栈帧同步
内联函数的代价:可执行代码的膨胀
C中取址运算符的拓展:
int arr[3] = {1,2,3};
int* parr = arr;
cout << parr[2] << endl;(我:也就是用一次取地址符对应的就要加一个*,那个指针表型形式只是int(*p)[3]=&arr;
//在C++中是严格类型匹配的,如果不匹配则直接报错。
int (* parr1)[3] = &arr;
cout << **parr1 << endl;
&运算符获取结构体或者类成员函数指针的方式
typedef void (*pfunc)();//定义一个函数指针
struct A
{
void showA()
{
cout << "22081班同学你好!!!" << endl;
}
};
A obj_a;
//&运算符获取结构体或类成员函数指针的方式:
void (A::*pfunc1)() = &A::showA;函数指针指向里面的那个函数
(obj_a.*pfunc1)();
const修饰符在C、C++中的异同:
const int b=6;
b——》只读变量,直接修改会出错,但可以指针强转改
const int* p1 = &a;
int* const p2 = &a;(这两个就不用说了);
着重说一说const int a=100;
这个出现在程序中,会直接保存到系统的符号表中,不在原来的a的地址中了
只要是遇见a,就是100,就算用*p改了之后,*p=200;a还是等于100;,是因为a在系统的符号表里呢,
取a就直接在符号表里面取了,但是加了volatile之后,就可以使用指针改了,就是不在那个符号表里面了,
这样定义const int volatile a = 100;
using的作用::typedef int int32《===》using int32=int
其次就是struck a{
默认是public。如果里面没有东西,就是一个字节大小,如果有就是按照结构体对齐来说,
其次函数不占用这里面的大小,函数实在文本段的
}
其次就是struck a{
默认是private。如果里面没有东西,就是一个字节大小,如果有就是按照结构体对齐来说,
其次函数不占用这里面的大小,函数实在文本段的
}
c和c++定义结构体变量
struct STU stu
STU stu