引用在创建时必须初始化
int a=10;
int &b=a;//赋值后b是a的别名,改变任何一个另一个也会改变
切记引用必须初始化!
引用不可以对字面量引用
int &a=10;//这是错误的不可以的
const int &a=10;//这个可以
std::string str(){return "hello";}
const std::string&str1=str();//因为返回的是字面量,所以必须加const;
修改引用
引用总是引用初始化那个变量;一旦创建无法修改。但是我们可以通过对原始变量赋值改变变量。
int a=10;
c=11;
int &b=a;
a=100;//可以
b=c;//错误不能让b引用c;
指向指针的引用和指向引用的指针
int *p;
int *&p1=p;//指针的引用
p1=new int ;
*p1=10;
int x=10;
int&y=x;
int *z=&y;//引用的指针
*z=100;//这个结果x=100;
引用数据成员
如果不指向其他变量,引用就无法存在,也因此必须在构造函数初始化器中初始化引用数据成员。
class People
{
public:
People(int&ref):mRef(ref)
{
}
private:
int &mRef;//这里引用必须初始化构造函数初始化器完成了之间的关联
}
引用参数
我们可以写一个交换函数
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}//此函数是引用调用的时候参数不能是常量
我们可以将指针转换为引用
int a=10,b=20;
int *p=&a;
int *p2=&b;
swap(*p,*p2)
将引用作为返回值
返回引用可以避免因复制而占大量内存,但绝对不能返回局部变量的引用,因为局部变量是在栈区,函数调用完立即释放已不存在变量。
#include<iostream>
using namespace std;
#include<string>
class student
{
public:
student(string name, int age)
{
this->name = name;
this->age = age;
}
string name;
int age;
};
ostream& operator<<(ostream& out, const student& obj)
{
out << obj.name << obj.age << endl;
return out;
}
int main()
{
student one("Tom", 12);
cout << one << endl;
return 0;
}
c++中的const 和 static
1.const 保护变量不被修改
2.const 指定函数或方法的参数保持不变
const int q=100;
q=10;//错误不准改变q
void fun(const int a)
{
//此函数中不得出现改变a的想法
}
const 指针
const int *p;p指向的值不可改变,p的指向可以改变
p=new int[5];
p[2]=10;//错误不得改变p所指的值
int *const p=nullptr;//p的指向不可改变,p指向的值可以修改
int a=10;
p=&a;//错误不得改变p的指向
*p=100;//可以
const int*p等价 int const *p//p指向的值不可改变,p的指向可以改变
const int *const p=nullptr等价 int const*const p=nullptr//p指向的值不可改变,p的指向不可以改变
const 引用
int a;
const int &b=a;
b=10;//错不可以通过引用改变a;但我们可以直接赋值改变a
void fun(const student&one)//student 是一个类
{
//不得有在本函数中改变对象one 的想法
}
static 关键字
离开和进入作用域时可以保留局部变量。
对于静态变量类内声明类外初始化
class student
{
public:
static int x;//类内声明类外初始化
}
int student::x=100;
类型和类型转换
using the=int ;//用the替换int
typedef int the;//用the 替换int
const_cast()用于给变量添加或去掉常量特性
static_cast()形如将int变double