重拾C++

 

引用定义:

  int a=10;

  int &b=a;对

  int &c;错

  引用声明时必须初始化。

对于不同类型数据间的引用只能是conse类型的,

double a=9.3 ; const int &b=a;对(相当于 int tmp=a;const int &b=tmp);

double a=9.3;int &b=a;错

类定义:

   class 默认成员为private类型的

   struct 默认成为为public类型的

定义一般不放在头文件中,声明可以放在头文件中(C++ primer简称cp 100),因为头文件可能被很多包含如果是包含定义会出现重复定义的情况。但是头文件可以包含定义类,const必须是被常量表达式定义 (c p,100有详细的说明)

  对于字符串的链接来说:必须要是string类在前面,不能像python一样连接

对于Vector来说,需要根据类的构造函数调用相应的初始化函数。定义vector size 的情况需要要加上<int>例如下面vector<int>::size_type

vector<int> ivec;

ivec[1]=10;错------下标无法添加元素

定义迭代器:

vector<int> ::iterator iter=ivec.begin()

*iter ===ivec[index]

const_iterator指只借助迭代器读,不需要写

可以使用const_cast 可以将在类型传化时将const性质去掉

 

在类中定义并且声明的函数默认为内联函数 

 

函数重载时要注意的是:

 如果只是函数的返回值不变 ,不是函数的重载,而是重复声明是错误的

使用同一个ifilestream.open()函数打开文件时,需要在上次结束时先调用close()  还有clear()清除标志位,这样才能正常的使用

关于类定义与声明: 

因为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成
员。然而,只要类名一出现就可以认为该类已声明。因此,类的数据成员可以是
指向自身类型的指针或引用:

 在类函数返回的为一个类的应用,需要使用return *this;函数类型一个为const另外一个为发const也是函数的重载

 

编译器按照成员声明在类中出现的次序来处理它们。通常,名字必须在使用
之前进行定义。而且,一旦一个名字被用作类型名,该名字就不能被重复定义:
typedef double Money;
class Account {
public:
568
Money balance() { return bal; } // uses global definition of
Money
private:
// error: cannot change meaning of Money
typedef long double Money;
Money bal;
// ...
};

explicit Sales_item(const std::string &book = ""):
isbn(book), units_sold(0), revenue(0.0) { }如果没有explict的话,如果有个函数a(Sales_item),并且调用时为a(string)这时会默认调用构造函数构造出一个临时的对象,传给函数,但是如果使用explicit 形容的构造函数是无法自动生成临时对象的

 

 

有时(但不是很经常),我们希望类的数据成员(甚至在 const 成员函数
内)可以修改。这可以通过将它们声明为 mutable 来实现。
可变数据成员(mutable data member)永远都不能为 const,甚至当它是
const 对象的成员时也如此。因此,const 成员函数可以改变 mutable 成员。
要将数据成员声明为可变的,必须将关键字 mutable 放在成员声明之前:

 

 

关于类中命名的问题:

当成员定义在类定义的外部时,名字查找的第 3 步不仅要考虑在 Screen
类定义之前的全局作用域中的声明,而且要考虑在成员函数定义之前出现的全局
作用域声明。例如:

 

 

记住,可以初始化 const 对象或引用类型的对象,但不能对它们赋值。在
开始执行构造函数的函数体之前,要完成初始化。初始化 const 或引用类型数
据成员的唯一机会是构造函数初始化列表中。编写该构造函数的正确方式为
// ok: explicitly initialize reference and const members
577
ConstRef::ConstRef(int ii): i(ii), ci(i), ri(ii) { }

 

对于protected 的成员来说,在派生类中只能用派生类的对象调用。不能再派生类中用基类调用

对于友元来说是可以访问private形容的函数或者变量的

 

所谓的动态绑定代表的是可以通过基类,调用相应的派生类中的函数。这样可以实现一个函数,来动态调用很多函数的情况。

 

在继承中,在public后使用   class  Base

  {

  public:

  std::size_t size()const;

  protected:

  std:size_t n;

  }                    

class dedrvied :private base{  }//这种情况下size()这个函数是Private,不能被外界直接调用。

如果使用

class dedrivide:private base{

public:

 using base::size;//强制将其定义为public类型的

protected:

using base::n;

 

 

 

注意到:

友元函数时不能被继承的。

 

应该注意在对象转换的过程中:

1.基类和派生类之间的继承访问原则影响很大,使用Public可以直接完成转化,是private 无法完成转换,是protected 可以完成转换。

需要在派生类中使用基类的构造函数初始化基类的成员。

 

在使用模板时

template<typename T,class u>

typename  和class 都可以使用

 还是需要注意的是在

使用了typedef struct aa{

int a;

int b;

}aa后 ,可以使用 (aa){3,4}生产一个临时的变量

 

运算符重载 :

 

 (1)运算符重载函数作为类的友元函数的形式:

  class 类名

  {

    friend 返回类型 operator运算符(形参表);

  }

  类外定义格式:

  返回类型 operator运算符(参数表)

  {

    函数体

  }

在类内必须要声明为friend类型的数据才可以 。

在类外的定义参数 

 

 

 

对vitual函数的理解:
  

posted on 2013-07-28 22:40  Practicer..  阅读(179)  评论(0)    收藏  举报

导航