当前位置:编程学习 > C/C++ >>

C++Primer读书笔记1

构造函数
Const 成员函数
将const关键字加在形参表之后,就可以将成员函数声明为常量,不能改变其所操作对象的数据成员,const必须同时出现在定义和声明中。
 
显示指定inline成员函数
 
class Screen
 
{
 
public:
 
       Screen(void);
 
       ~Screen(void);
 
       inlinevoid get(char ch);
 
};
 
inline void Screen::get(char ch)
 
{
 
       cout<<ch<<endl;
 
}
 
可变数据成员
如果我们希望在const成员函数内修改成员变量,那么我们就把该成员声明为mutable。
 
class Screen
 
{
 
public:
 
       mutableint num;
 
public:
 
       voiddisplay() const;
 
};
 
void Screen::display() const
 
{
 
       num++;
 
       cout<<num<<endl;
 
}
 
void main()
 
{
 
 Screen *a=new Screen();
 
 a->num=1;
 
 a->display();
 
 getchar();
 
}
 
访问类的成员两种方法:
 
Screen *a=new Screen();
 
 a->num=1;
 
 a->display();
 
 Screen temp;
 
 temp.num=7;
 
 temp.display();
 
构造函数初始化式
初始化列表以冒号开始,接着是一个以逗号分开的数据成员列表,每个数据成员后面跟一个放在括号的初始化式,初始化式只能在构造函数的定义中而不是在声明中定义。
 
没有默认构造函数的类类型成员,以及const或引用类型成员,必须使用构造函数初始化列表初始化列表,在构造函数体内初始化时行不通的,
 
class Screen
 
{
 
private:
 
       inti;
 
   const int ci;
 
       int&ri;
 
public:
 
       Screen(intii);
 
       ~Screen();
 
       voiddisplay();
 
}
 
Screen::Screen(int ii):i(ii),ci(ii),ri(ii)
 
{
 
}
 
下面做法编译出错
 
Screen::Screen(int ii)
 
{
 
       i=ii;
 
       ci=ii;
 
       ri=ii;
 
}
 
构造函数初始化成员列表的成员初始化顺序
成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推。
 
 
 
private:
 
       intj;
 
       inti;
 
   
 
Screen::Screen(int ii):j(ii),i(j)
 
 
 
用尚未初始化的j来初始化i。
 
默认构造函数
只要定义一个对象时没有初始化时,就需要使用默认构造函数,为所有形参提供默认实参的构造函数也定义了默认构造函数。
 
一个类只要定义了一个构造函数,编译器也不会再生成默认构造函数,只有当一个类没有定义构造函数时,编译器才会自动生成默认构造函数。
 
具有类类型的成员通过运行各自的默认构造函数来进行初始化,内置和复合类型的成员如指针和数组,只对定义在全局作用域的对象才初始化,当对象定义在局部作用域时不进行初始化。
 
隐式的类类型转化
class Sales_item{
 
public:
 
       intunits_sold;
 
       doublerevenue;
 
       stringisbn;
 
       Sales_item(conststring &book=""):isbn(book),units_sold(0),revenue(0.0)
 
       {}
 
       voiddisplay(Sales_item item);
 
};
 
void Sales_item::display(Sales_item item)
 
{
 
       cout<<item.units_sold<<endl;
 
}
 
      
 
int main()
 
{
 
       stringnull_book="helllo";
 
 
 
       Sales_item  *a=new Sales_item();
 
       a->display(null_book);
 
       getchar();
 
       return0;
 
}
 
上述构造函数实现了,字符串到类类型的隐式转换,
 
可以通过将构造函数声明为explicit,防止在需要隐式转换的上下文中使用构造函数,explicit关键字只能用于类内部的构造函数上,在类的定义体外部不在重复,示例如下:
 
using namespace std;
 
class Sales_item{
 
public:
 
       intunits_sold;
 
       doublerevenue;
 
       stringisbn;
 
       explicitSales_item(const string&book=""):isbn(book),units_sold(0),revenue(0.0)
 
       {}
 
       voiddisplay(Sales_item item);
 
};
 
void Sales_item::display(Sales_item item)
 
{
 
       cout<<item.units_sold<<endl;
 
}
 
      
 
int main()
 
{
 
       stringnull_book="helllo";
 
 
 
       Sales_item  *a=new Sales_item();
 
       a->display(null_book);
 
       getchar();
 
       return0;
 
}
 
未转换而显示地使用构造函数
class Sales_item{
 
p
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,