• 关于 auto 使用的一个小细节


    class A
    {
    public:
    	int m_a;
    
    	A() :
    		m_a(0)
    	{
    		std::cout << "A()" << std::endl;
    	}
    
    	A(const A& other) :
    		m_a(other.m_a)
    	{
    		std::cout << "A(const A&)" << std::endl;
    	}
    
    	int& get_a() 
    	{
    		return m_a;
    	}
    
    	A& get_class()
    	{
    		return (*this);
    	}
    };
    

      

    void solve()
    {
    	A _A;
    	auto t = _A.get_class();
    
    	t.m_a = 2;
    	std::cout << _A.m_a << std::endl;
    }
    output:
    A()
    A(const A&)
    0
    

    从output可以看出,auto 自动推导了  A t = _A.get_class(),故调用了class A的拷贝构造函数

    void solve()
    {
    	A _A;
    	auto& t = _A.get_class();
    
    	t.m_a = 2;
    	std::cout << _A.m_a << std::endl;
    } 
    output:
    A()
    2
    

    可以看出 auto&  推导出了  A& t = _A.get_class(),这样我们就知识对返回的实例引用的操作,节省了额外的开销

    总结,对于 auto 的使用,我们得注意是否加&或者在该情况下auto可能推导出的类型是不是会重新拷贝一个副本而导致内存的申请  

    A& get_class() const
    {
    	return (*this); // const A* const this
    }
    
    错误	C2440	“return”: 无法从“const A”转换为“A &”
    
    
    const A& get_class() const
    {
    	return (*this);
    }
    
    正确
    

      

  • 相关阅读:
    Unique path
    *Jump Game
    Valid Palindrome
    *Reverse Words in a String
    Min Stack
    [?]*Simplify Path
    *Valid Parentheses
    *Sqrt(x)
    String to Integer (atoi)
    Add Digits
  • 原文地址:https://www.cnblogs.com/SSummerZzz/p/15831717.html
Copyright © 2020-2023  润新知