1.内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。
一般在代码中用inline修饰,但能否形成内联函数,需要看编译器对该函数定义的具体处理。
such as:
inline int add(int a,int b,int c) { return a+b+c; }
不管是什么模板,编译器都必须看到全部的代码才能为一种给定的类型创建出一个新的实现来。
内联方法的引入很好的解决了在创建类模板时,避免类声明和类定义相互分离。
在类里,内联方法的基本含义是在声明该方法的同时还对它进行定义。减少模板的声明,类的内联such as:
class Person { Person(std::string name) { this -> name = name; } }
...
类的内联Demo
template <class T> class Stack { public: Stack(unsigned int size = 100) { this -> size = size; data = new T[size];//初始化一个泛型数组 sp = 0; } ~Stack() { delete []data; } void push(T value) { data[sp++] = value; } T pop() { return data[--sp]; } private: unsigned int size;//数组容器data的大小 unsigned int sp;//栈的当前位置 T *data;//存储入栈的数组 }; int main() { Stack<int> intStack(100); intStack.push(1); intStack.push(2); intStack.push(3); std::cout << intStack.pop() << "\n"; std::cout << intStack.pop() << "\n"; std::cout << intStack.pop() << "\n"; }
.注意
如果你打算在自己的程序里使用Stack模板,一定要给它增加一个副本构造器和一个赋值操作符重载,就像我们之前做过的样子一样。
我们刚刚的代码还缺少必要的错误处理功能,例如在栈已满的时候调用push()方法,或者在栈为空的时候调用pop()方法,会导致程序出错。
c++并没有限制只能使用一个类型占位符,如果类模板需要一种以上的类型,根据具体情况可以使用几个占位符即可。
template<class T,class U> class MyClass { } // 实例化时,我们只需要这么做 MyClass<int,float> myClass;
...