Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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
C++ 成员函数是如何实例化的?_C++ - Fatal编程技术网

C++ 成员函数是如何实例化的?

C++ 成员函数是如何实例化的?,c++,C++,成员函数是在被调用时实例化的,还是在程序中只实例化一次 #include<iostream> using namespace std; template<typename T> class test { public: test(); void test_function_1(int iv = 0); void Print(void) const; private: T date; }; template<typename T&g

成员函数是在被调用时实例化的,还是在程序中只实例化一次

#include<iostream>
using namespace std;

template<typename T>
class test {
public:
    test();
    void test_function_1(int iv = 0);
    void Print(void) const;
private:
    T date;
};

template<typename T> test<T>::test()
{
    date = 0;
}

template<typename T> void test<T>::test_function_1(int iv)
{
    date += iv;
}

template<typename T> void test<T>::Print(void) const
{
    cout << date << endl;
}

int main(void)
{
    test<int> s;

    s.test_function_1(); 

    s.Print(); 

    s.test_function_1(100);

    s.Print();

    return 0;
}
#包括
使用名称空间std;
模板
课堂测试{
公众:
test();
无效测试功能(int iv=0);
作废打印(作废)常数;
私人:
T日期;
};
模板测试::测试()
{
日期=0;
}
模板无效测试::测试函数1(int iv)
{
日期+=iv;
}
模板无效测试::打印(无效)常量
{

在你的代码中,你有一个模板类,你可以实例化它。因此,它的成员函数只作为普通类的成员函数实例化一次。当它们被实例化时,棘手的部分是。你可以检查以下代码:

struct  A{};

template<typename T>
class test {
public:
    void test_function(int iv = 0) { date += iv; }
private:
    T date{};
};

int main(void)
{
    test<A> s1; // class instantiation is ok
    //s1.test_function(0); - error when calling member function

    test<int> s; // ok
    s.test_function(0); // ok

    return 0;
}
struct A{};
模板
课堂测试{
公众:
void test_函数(intiv=0){date+=iv;}
私人:
T日期{};
};
内部主(空)
{
测试s1;//类实例化正常
//s1.test_函数(0);-调用成员函数时出错
测试s;//确定
s、 测试函数(0);//正常
返回0;
}

类<代码>测试< /COD>将被实例化,尽管成员函数不编译(因为结构A不提供int类型的<代码>操作符+= /COD>)。只有当<<强> >上下文< /强>时,才实例化成员函数。C++标准描述如下:

§14.7.1隐式实例化

除非有一个函数模板 专门化已显式实例化或显式 专门化,函数模板专门化是隐式的 在以下上下文中引用专门化时实例化 需要存在函数定义。除非调用 函数模板显式专门化或对函数的成员 一个显式专门化的类模板,一个 函数模板或类模板的成员函数是 在以下上下文中调用函数时隐式实例化 需要默认参数的值


实例化函数是什么意思?如果
print
不是类成员函数,您的问题会改变吗?函数不会实例化。只有对象(和模板),@PaulSanders不,函数也是实例化的。这只是一个不太重要的细节。@Password你可以实例化对象和模板,不是吗?就这些。@PaulSanders谢谢你的回答,我现在几乎明白了你也可以看看这里: