码迷,mamicode.com
首页 > 其他好文 > 详细

【Note】

时间:2015-05-07 06:28:37      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

 

0.感觉essential C++真的不错,至少很适合我这种看不下长篇大论的人= - =而且叙事顺序也很清晰,比起primer和primer plus的介绍顺序能更快给我一个对西佳佳大致的概念。

书真的是越精简越好.

 

 

1.类模版  

  对于函数内容几乎相同,只是形参类型不同的函数,可以定义一个函数模版(function template).但要事先知道可能会使用的形参类型,即template不能针对未知类型.

定义:

//define a compare template
// implement strcmp-like generic compare function
// returns 0 if the values are equal, 1 if v1 is larger, -1 if v1 is smaller

template <typename T>
int compare(const T &v1, const T &v2)//<>内是模板形参表,该表不可为空!
     {
         if (v1 < v2) return -1;
         if (v2 < v1) return 1;
         return 0;
     }

调用:

int main()
{
   //I suppose T is int.
   //now call the compare template
   cout<<compare(1,0)<<endl;
  
   //now T is string.
   //call again
   cout<<compare("cww","isme")<<endl;
   return 0;           
}
声明inline模版:
template <typename T>
inline T compare(const T&, const T&){}

inline怎么看都不太熟悉(有三次了啊...)大概是不顺眼,暂时别考虑用.

 

 

2.泛型编程:

暂时skip.

貌似主要针对template.

 

 

3.实现一个class:

class cww
{
  public:
      ……
  private:
      ……
}

①member function必须在class主体内进行声明,但可不同时进行定义.

在class内定义的即自动视为inline函数,在其之外定义的,要在头文件中指定关键词inline.

如对于某Cww类中bool empty()和bool pop()函数,要在class Cww外定义它:

inline:

inline bool Cww::empty(){……}
bool Cww:pop(string &elem){……}

上述中,Cww::empty()是在告诉compiler,empty()是Cww class的一个member.

 

 

4.Constructors(构造)和Destructors(析构):

Constructors的函数名称必须与class相同,且不应返回型别,亦不需要返回值,可以重载.

举个栗子:

//define a class
//设定元素个数、起始位置、

class Triangular
{
  public:
  ……
  privateint _length;
    int _beg_pos;
    int _next;          
}

//对Triangular进行重载构造:
class Triangular
{
//一组重载的构造函数:
  public:
    Triangular();
    Triangular(int len);
    Triangular(int len,int beg_pos);
//……
}

当调用这些重载函数时,编译器会根据获得的参数来确定被调用的函数.

*当代码为:

Triangular t=8;

意为获取一个参数而非是赋值操作.

以最简单的无参函数Triangular()为例,它的内容可以有两种情况:

//1st,它不接受任何参数
Triangular::Triangular()
{
  _length=1;
  _beg_pos=1;
  _next=0;  
}



//2nd,它为每个参数提供默认值 class Triangular { //…… public: Triangular(int len=1,int bp=1); //…… } Triangular::Triangular(int len,int bp) { _length=len>0?len:1; _beg_pos=bp>0?bp:1; _next=_beg_pos-1; }

Constructor还有第二种初始化方法,那就是member initialization list:

Triangular::Triangular(const Triangular &rhs)
  :_length(rhs._length),
   _beg_pos(rhs._beg_pos),
   _next(rhs._beg_pos-1)
{}//{}内就是空的.

初始值放在member后的()内.

现在暂不需考虑一二两种初始化方法的优先性.

 

接下来学习destructor:

Destructor用来释放在constructor中或对象生命周期中配置的资源.

名称规定:‘~‘加上class名称.如在去Qt中:

MainWindow::~MainWindow()
{

}

Destructor并非绝对必要.根据情况而定,比如Triangular就并没有什么好释放的.

事实上,C++最难的部分之一,就是了解何时需要定义destructor而何时不需要.

(既然这样也暂时没我的事了,不用为妙= - =)

ps:rhs=运算符右边的操作数,同理lhs=运算符左边的操作数.

 

5.Mutable(可变)和const:

如下,要保证获取的参数train在整个sum()中不被改变,以防sun()所调用的任何一个函数时更改了train的值,因此用到const.

int sum(const Triangular &train){
}

这个貌似是必须加的哦,否则会被compiler警告(报错/总之是不接受的).

mutable暂时skip.我想也用不着.

 

6.this指针

【明天继续=-=】

 

 

 

 

 



【Note】

标签:

原文地址:http://www.cnblogs.com/suzyc/p/4483759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!