GeekBand C++ WEEK3

一 . 关于类型转换

1. conversion function (转换函数) —— “转出去”

  1. 类型转换函数的一般形式如下:
    operator *type*() const;
  2. 类型转换函数的特点:
  • 必须是类的成员函数;
  • 形参列表必须为空;
  • 不能声明返回类型;
  • 类型转换函数通常应该是 const
  • 如果需要,可以写多个类型转换函数

3.参考案例:

operator double() const {
    return  (double) (m_numerator / m_denominator) ;
}

2. non-explicit-one-argument ctor —— “转回来”

  1. one-argument 不是 one-parameter. .
  2. 能通过一个实参调用的构造函数定义了一条从构造函数的参数类型向类类型隐式转换的规则,
  3. 参考案例:
public :
      Fraction (int num, int den = 1) : m_num(num), m_den(den) {}

Fraction de = f + 4; //调用 non-explicit ctor 将 4 转为 Fraction(4,1)

3. explicit-one-argument ctor

  1. explicit 作为关键字,主要用在构造函数前面,而且关键字 explicit 只对一个实参的构造函数有效,并且只能在类内声明构造函数时使用 explicit 关键字,在类外定义时不应重复,
public :  // 这样就不能自动将 4 变为 4/1  
      explicit Fraction (int num, int den = 1) : m_num(num), m_den(den) {}

4. 避免有二义性的类型转换

  1. 当类同时定义了类型转换运算符及重载运算符时特别容易产生二义性,
  2. 如果我们对同一个类既提供了转换目标时算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题。

二 . 关于 C++ 2.0

1. 了解编译器对c++ 2.0 的支持度

  1. 对Dev C++ 最简单的方法:
#include <iostream>

int main()
{
  std::cout <<  __cplusplus ;
}

2. c++ 2.0 的几个新特性

**1. auto **

  1. 引进原因:编译器常常需要把表达式的值赋给变量,因此需要在声明变量的时候清楚知道表达式的类型,但有时很难做到,因此引进 auto 类型说明符,用它让编译器替我们区分析表达式所属类型。
  2. 因为没有赋值,无法推断出是什么类型,因此 auto 定义的变量必须有初始值。
  3. 使用 auto 也可以在一条语句中声明多个变量,但该语句中的所有变量的初始基本数据类型必须一致。

**2. ranged_base for **

  1. 基本理解:range for 这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作;
  2. 语法形式:
 for ( declaration : expression){
           statement

declaration 声明一个变量,给变量将被用于访问序列中的基础元素;
expession 是一个对象, 用于表示一个序列,或者说是一个容器。

  • 如果要想改变序列中的值,必须把循环变量定义成引用类型。

3. variadic templates —— 数量不定的模版参数

  1. variadic template 就是一个接受可变数目参数的模板函数或模板类。可变数目的参数被称为 parameter packet ;
  2. 语法:
template <typename T , typename... Args>
void foo (const T& t, const Args& ... rest)
  1. 当我们需要知道包中有多少元素是,可以使用 sizeof... 运算符。

三 . 关于 templete -- 初识模版

1. function template --函数模版

  1. 一个函数模版就是一个公式,可用来生成针对特定类型的函数版本;
  2. 语法:
    template <typename T>
    模版定义以关键字 template 开头,后跟一个模版参数列表,用<>将以逗号分隔的一个或多个模版参数.
  3. 当我们调用一个函数模板时,编译器用函数实参来为我们推断函数实参--实参推导;
  4. 在模版参数列表中,class , typename 这两个关键字的含义相同,可以相互使用。

2. class template --类模版

  1. 类模版是用来生成类的蓝图的;
  2. 在设计 class 时,可以把类型抽出来允许使用者任意指定;
  3. 编译器不能为类模版推断模版参数类型,因此为了使用类模版,我们必须在模版名后的尖括号中提供额外信息 -- 就是在使用时指定;

3. member template --成员模版

  1. *一个类(无论是普通类还是类模版)可以包含本身是模版的成员函数,这种成员被称为成员模版。 *
  2. 其实就是说模版里面的一个member,而它自己本身又是一个template ;

**4. 关于模版特化的基础知识 **

  1. 模版特化:

    1. 当我们不希望使用模版版本时,可以定义类或函数模版的一个特例化版本;
    2. 一个特例化版本就是模版的一个独立的定义,在其中一个或多个模版参数被指定为特定的类型。
  2. 模版偏特化 (partial specialization) -- 部分特例化:

  3. 偏特化的模版参数列表是原始模版的参数列表的一个子集或者是一个特例化版本。

  4. 我们可以只特化成员函数而不是特例化整个模版。

模版总结: 学习基础知识为第五周做准备

四 . 本周课程疑问

  • 关于 pointer-like , function-like 不是很懂,以后慢慢学习。

推荐阅读更多精彩内容