一,引用
#ifdef __cplusplus//c++
cout<<"a= "<<a<<endl;//c++的方式
#else
printf("a=%d\n",a);//c语言的方式
const int a=10;
int b=0;
int *p=(int*)&a;//OK
int*s=const_cast<int*>(&a);//去常性强转(写的比较丑陋容易引起注意)底层还是又上一行代码实现的只是足够丑陋
const int a=10;
const int&b=a;//ok
int&c=(int&)a;//不知道
引用和const
二,引用和指针有什么样的区别?
引用在语法层次上来看引用就是一个变量的别名,相当于给一个实体起来两个名字;
从底层来看引用相当于一个自身为常性的指针;
//引用再编程方面的看法
//引用在汇编层面的看法
int fun()
{
int a = 10;
return a;
}
int& funref()
{
int a = 20;
return a;
}
int main()
{
int x = fun();//返回一个将亡值赋值给x
int y = funref();
/*如果函数的返回值的生存期不受函数生存期
的影响就可以
1,加static
2,全局变量
3,int& fun(int& x)//以引用进的可以以引用出
{
return x;
}
*/
/*int& funref()相当于
int*constfunref()
{
int a=20;
return &a;//返回的是a的地址这样y接收到的是一个已经回收的地址里面的值
至于是否正确很难说(错误的方法)函数结束后分的空间就会回收
}*/
int& z = funref();
cout << x << " " << y <<" "<<z<< endl;
return 0;
}
处理构造函数和拷贝构造函数以外其他的函数不可以使用初始化列表来赋值
class Rectangle
{
private:
int left, top, right, bottom;
public:
Rectangle(int e=0, int t=0, int r=0, int b=0) :left(e), top(t), right(r), bottom(b)
{}
void SetLeft(int e) { left = e; }
void SetTop(int t) { top = t; }
void SetRight(int r) { right = r; }
void SetBottom(int b) { bottom = b; }
int GetLeft() const { return left; }//定义成常性,常性的对象和非常性的对象都可以调用
int GetTop() const { return top; }
int GetRight() const { return right; }
int GetBottom() const { return bottom; }
void show()const
{
cout << "left-top point is(" << left << "," << top <<":"")" << endl;
cout << "right-bottom point is(" << right << "," << bottom << ":"")" << endl;
}
};
int main()
{
Rectangle r1;
Rectangle r2(1, 1, 20, 20);
const Rectangle& r = r2;
r.GetLeft();
return 0;
}
函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。