C++Primer学习笔记(6)

来源:互联网 发布:广州多益网络 编辑:程序博客网 时间:2024/05/16 08:08

注意:重写赋值操作符时时刻注意自赋值的情况if(this != &rhs)...


三法则:如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则。


如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。


模板与泛型编程

inline函数模板

函数模板可以用于非模板函数一样的方式声明为inline。说明符放在模板形参表之后、返回类型之前,不能放在关键字template之前。

template<typename T> inline T min(const T&, const T&);


类型形参的实参的受限转换

一般而言,不会转换实参以匹配已有的实例化,相反,会产生新的实例。除了产生新的实例化之外,编译器只会执行两种转换:

1.const转换:接受const引用或const指针的函数可以分别用非const对象的引用或指针来调用,无须产生新的实例化。如果函数接受非引用类型,形参类型和实参都忽略const,即,无论传递cosnt或非const对象给接受非引用类型的函数,都使用相同的实例化。

2.数组或函数到指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应用常规指针转换。数组实参将当作指向其第一个元素的指针,函数实参当作指向函数类型的指针。

如:

template <typename T> T fobj(T, T);template <typename T>T fref(const T&, const T&);string s1("a value");const string s2("anther value");fobj(s1,s2);//OKfref(s1,s2);//OKint a[10], b[42];fobj(a, b);//OK,都转换成int*类型.fref(a, b);//error,形参为引用时,数组不能转换为指针。


类模版中的友元声明

1.普通友元

非模板类或非模板函数可以是类模板的友元:

template <class Type> class Bar{friend class FooBar;friend void fcn();};

2.一般模板友元关系

友元可以是类模板或函数模板:

template <class Type> class Bar{template <class T> friend class Foo1;template <class T> friend void temp1_fcn1(const T&);};
Foo1的任意实例都可以访问Bar的任意实例的私有元素,类似地,temp1_fcn1的任意实例可以访问Bar的任意实例。


3.特定的模板友元关系

除了将一个模板的所有实例设为友元,类也可以只授予特定实例的访问权:

template <class T> class Foo2;template <class T> void temp1_fcn2(const T&);//等价于(T const&)template <class Type> class Bar{friend class Foo2<char*>;friend void temp1_fcn2<char*>(char* const &);//此地方得注意,const 是修饰&的,不是修饰T的。};

下面形式的友元声明更为常见:
template <class T> class Foo2;template <class T> void temp1_fcn2(const T&);template <class Type> class Bar{friend class Foo2<Type>;friend void temp1_fcn2<Type>(const Type&);};

4.声明依赖性

template <class T> class A;template <class T> class B{public:friend class A<T>;//ok,A已经声明是一个模板类friend class C;//ok,C一定是一个普通类template <class S> friend class D;//ok,D是一个模板friend class E<T>;//error,得声明friend class F<int>;//error,同上};




原创粉丝点击