使用auto标明一个变量,这个变量永远不会是引用变量。
使用auto&标明一个变量,这个变量有可能被编译器推导为引用变量。
#include <iostream>
#include<vector>
#include <time.h>
using namespace std;
class A
{
public:
A()
{
year = 0;
for (int i = 0;i < 5;i++)
{
intVec.push_back(i);
}
}
void show()
{
for (auto i : intVec)
{
cout <<" "<< i << " ";
}
cout << endl;
}
vector<int>& getIntVec()
{
return intVec;
}
int& getYear()
{
return year;
}
void showYear()
{
cout << "year: "<< year << endl;
}
private:
vector<int> intVec;
int year;
};
class Test
{
public:
//是否改变原来的值?
void test1()
{
A objA;
auto intVec = objA.getIntVec();
intVec[0] = 111;
objA.show();
auto& intVec2 = objA.getIntVec();
intVec2[1] = 222;
objA.show();
auto year = objA.getYear();
year = 666;
objA.showYear();
}
//效率上的区别
void test2()
{
vector<int> data(11111111);
time_t t1, t2, t3;
t1 = time(NULL);
for (int i = 0;i < 100;i++)
{
auto testData = data;
}
t2 = time(NULL);
for (int i = 0;i < 100;i++)
{
auto& testData = data;
}
t3 = time(NULL);
cout << "auto消耗:" << difftime(t2, t1) << endl;
cout << "auto&消耗:" << difftime(t3, t2) << endl;
}
};
int main()
{
Test test;
//这里打开注释可以选择运行哪一个测试案例
//test.test1();
//test.test2();
}
面试知识点:
初始化值的声明?
对于auto而言,其在于type deduce,它不会允许没有初始化值的声明
auto y; // error
auto编码的好处?
auto可以节省很多字,尤其是容器的iterator
vector<int> vec;
vector<int>::iterator iter=vec.begin();
auto it=vec.begin();
第二种写法简介了很多
用于lambda表达式
auto closure = [](auto x, auto y) { return x * y;}