Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解,;模板中的运算符 所以我现在正在阅读SAMS,教你自己C++,我不能弄明白使用和运算符的时间和原因,因为在很多情况下它似乎是不必要的,比如: template <typename objectType> objectType & GetMax (const objectType & value1, const objectType & value2) { if (value1 > value2) return value1; else return value2; }; 模板 objectType和GetMax(常量objectType和value1、常量objectType和value2) { 如果(值1>值2) 返回值1; 其他的 返回值2; };_C++ - Fatal编程技术网

了解,;模板中的运算符 所以我现在正在阅读SAMS,教你自己C++,我不能弄明白使用和运算符的时间和原因,因为在很多情况下它似乎是不必要的,比如: template <typename objectType> objectType & GetMax (const objectType & value1, const objectType & value2) { if (value1 > value2) return value1; else return value2; }; 模板 objectType和GetMax(常量objectType和value1、常量objectType和value2) { 如果(值1>值2) 返回值1; 其他的 返回值2; };

了解,;模板中的运算符 所以我现在正在阅读SAMS,教你自己C++,我不能弄明白使用和运算符的时间和原因,因为在很多情况下它似乎是不必要的,比如: template <typename objectType> objectType & GetMax (const objectType & value1, const objectType & value2) { if (value1 > value2) return value1; else return value2; }; 模板 objectType和GetMax(常量objectType和value1、常量objectType和value2) { 如果(值1>值2) 返回值1; 其他的 返回值2; };,c++,C++,另一个例子: Template <typename T> class myTemplateClass { public: void SetVariable (T& newValue) {m_Value = newValue; }; T& GetValue() {return m_Value;}; private: T m_Value; }; 模板 类myTemplateClass { 公众: void Se

另一个例子:

Template <typename T>  
class myTemplateClass  
{  
public:   
    void SetVariable (T& newValue) {m_Value = newValue; };

    T& GetValue() {return m_Value;};

private:   
    T m_Value;  
};
模板
类myTemplateClass
{  
公众:
void SetVariable(T&newValue){m_Value=newValue;};
T&GetValue(){返回m_值;};
私人:
T m_值;
};

请帮助我理解为什么&,我知道它获取数据类型的地址,在这里!这绝对不会让学习STL变得更容易。。。。。。。。。。谢谢!=)

这不是运算符,也与模板没有(直接)关系

它是一个类型修饰符,创建(或指示、表示或形成)引用,就像
*
创建指针一样

很多时候,这是一种优化,而不是一种必要。有必要的两种或三种情况:

  • 在复制构造函数中,需要避免无限递归:

    class X
    {
         //X(X);
         // pass by value, the formal parameter is a copy of the actual parameter
         // the copy constructor must be called to make the copy
    
         X(const X&); // pass by reference, ok, no copy constructor call necessary
    };
    
    Const引用通常不必复制大型对象,这是一种非常有用的优化,没有令人惊讶的行为

  • 当函数的返回类型,尤其是
    运算符[]
    重载必须出现在表达式的左侧时:

    class Container
    {
         //Element operator[](int index);
         // problematic because c[i] is a temporary
         // so c[i] = 5; doesn't actually modify the collection, like it would with an array
    
         Element& operator[](int index); // correct
    
    })

    与此类似,对于改变其左操作数的运算符(如复合赋值和流插入),有必要使用非常量引用参数

任何其他情况(例如输出参数)都可以(而且我认为应该)用指针来处理,因为看起来像传递值但改变参数的函数调用违反了最小意外原则。完美的例子:
auto_ptr a=newint(5);f(a);/*是否仍然有效*/

这就引出了案例3(创建原因是有人在运算符之外使用了非常量引用):

  • 在模板中,当实际类型可能由
    auto_ptr
    unique_ptr
    生成时,需要一个引用以避免推断破坏原始类型的类型:

    auto_ptr<int> a = new int(5);
    
    //template<typename T>
    //void dump_target( T handle ) { cout << *item; }
    // bad: dump_target(a); destroys *a
    
    template<typename T>
    void dump_target( const T& handle ) { cout << *item; } // correct
    
    auto_ptr a=新整数(5);
    //模板
    
    //ValueDimpAgTalk(t句柄){Cut-FutualPursialPosiple,它是不一样的,你知道哪个得到了一个对象的地址。它是一个完全不同的用途。你需要一本关于C++的好书……并且不要把自己灌输到模板中,至少等到你知道什么是参考。