C++语言中的细节_2

原创 2013年12月06日 01:30:41

//《c++ Primer》笔记 

//P396

可以通过将构造函数声明为explicit,来防止在需要隐式转换的上下文中使用构造函数。(简单来说,就是使用expicit来防止隐式转换)

如:

class A{
public:
      explicit A(int j=0):i(j){}
      int f(const A &a){}
private:
      int i;
};
int main(){
     A a;
     int j;
     a.f(j);  //error:隐式类型转化被explicit阻止,不会调用构造函数来创建一个临时对象,此时f函数的实参只能是类A的对象的引用
}

//P221

内联函数:将函数指定未内联函数,通常就是将它在程序中每个调用点上"内联地"展开。

                    优点:省区调用函数的开销。

                    缺点:1.以代码膨胀为代价。

                                2.每一处内联函数的调用都要复制代码,消耗更多的内存空间。

//P455

转换操作符是一种特殊的类成员函数。

如将类类型转换为标准类型:

class SmallInt{
public:
      SmallInt():i(0){}
      operator int() const {return i;}
private:
       int i;
};
注意: 1.转换函数必须是成员函数

          2.不能指定返回类型

          3.形参表必须为空


// Chapter.15

除了构造函数外,任意非static成员都可以是虚函数。

如果派生类没有重定义某个虚函数,则使用基类中定义的版本。

一旦函数在基类中声明为虚函数,它就一直为虚函数。

派生类可返回基类函数所返回类型的派生类的引用(或指针)。

例:base类可以定义返回 base*的虚函数,

       derived类可以定义返回为base*或derived*。

如果需要声明(但不实现)一个派生类,则声明包含类名但不包含派生列表。

如: 

class Derived;  //虽然Derived类继承Base类,但是声明中不包含派生列表

protected成员可以被派生类对象访问,但不能被该类型的普通用户访问。


动态绑定必须满足的两个条件:

1.只有指定为虚函数的成员函数才能进行动态绑定。

2.必须通过基类类型的引用或指针进行函数调用。

现在就第2点进行分析:

为什么是基类类型,为什么是引用或者指针:

因为可以将派生类对象的引用(或指针)转换未基类子对象的引用(或指针)    //实参是该对象的引用,对象本身未被赋值,并且,转换不会在任何方面改变派生类型对象。

但没有从派生类对象到基类对象的直接转换  //派生类对象可以转换未基类对象,但这是一个间接转换的过程。这将丢弃派生类定义的成员。  

也没有从基类对象(或引用,指针)到派生类对象(或引用,指针)的转换   //从基类转换为派生类,则派生类新定义的部分在这个对象(或引用,指针)内是尚未定义的,而且基类对象并未给派生类的新定义部分分配存储空间。这样则在需要用道派生类的代码时出错。

如果非得从基类到派生类进行转换,在确保这个转换是安全的,就可以使用static_cast强制编译器进行转换。或者,用dynamic_cast申请在运行时进行检查。

如:

Derived d;
Base *bp=&d;
Derived dp=bp;   //error
Derived dp=static_cast<Derived>bp;  //OK

非虚函数总是在编译时根据调用该函数的对象、引用或指针的类型而确定。


覆盖虚函数机制:派生类虚函数调用基类版本时,必须显式使用作用域操作符。


派生类由多个部分组成:派生类本身定义的非static成员+由基类非static成员组成的子对象。


P484  using Base::size;






























c语言部分库函数,代码实现,以及细节理解

代码来自:   http://blog.csdn.net/v_JULY_v
  • wangyaninglm
  • wangyaninglm
  • 2014年11月22日 21:32
  • 1315

C语言实现链表节点的插入和删除

/* 链表节点的插入与删除 编译环境:VC++ 6.0 编译系统:windows XP SP3 */ #include #include #...
  • Jamie321
  • Jamie321
  • 2016年08月30日 15:22
  • 3680

C语言实现单链表节点的删除(不带头结点)

对链表节点进行增删改查是最基本的操作,这篇博客将会来实现对节点的删除。其他的操作可参考《C语言实现链表的基本操作》这篇博客。删除某个节点有两个类型:(1)删除i某个位置的节点;(2)判断x值是否在链表...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年02月25日 18:21
  • 5724

基本语言细节--《深度探索C++对象模型》--(2)The Semantics of Constructors--总结点

主要是针对Lippmen 书中C++中构造函数以及复制构造函数的论述做一个大致总结,以期说明编译器在C++语言背后为我们做了哪些事情!...
  • wolangjushi
  • wolangjushi
  • 2013年11月20日 13:12
  • 957

C++与C语言细节差异分析

[转]C++与C语言细节差异分析 http://hi.baidu.com/ta22/blog/item/23ba7cee9ec324f8b2fb95bb.html   ...
  • pizi0475
  • pizi0475
  • 2015年05月22日 14:54
  • 499

基本语言细节--《深度探索C++对象模型》--(6)Runtime Semantics-总结点

基本语言细节--《深度探索C++对象模型》--(6)Runtime Semantics-总结点 1.注意开篇所讲的编译器产生的代码,里边有很多临时性对象,应理解编译器在背后为我们做了什么!正如Lip...
  • wolangjushi
  • wolangjushi
  • 2013年11月21日 13:12
  • 861

C++与C语言细节差异分析

原文地址如下: http://wenku.baidu.com/view/721dda0876c66137ee0619f0.html C++与C语言细节差异分析 C和C++是很流行的语言,目前大...
  • rxy429
  • rxy429
  • 2013年08月21日 23:41
  • 407

基本语言细节---C++ 虚函数表解析 陈皓

C++ 虚函数表解析   陈皓 http://blog.csdn.net/haoel     前言   C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的...
  • wolangjushi
  • wolangjushi
  • 2013年11月19日 13:48
  • 749

基本语言细节--《The C++ Programming Language 》--(1)开辟鸿蒙

基本语言细节--《The C++ Programming Language 》--(1)开辟鸿蒙 1.语言磨砺了我们思维的方式,也决定着我们思考的范围。--B.L.Whort; 2.C++能干什么?...
  • wolangjushi
  • wolangjushi
  • 2013年11月28日 13:42
  • 860

C++与C语言细节差异分析

出处:http://cache.baidu.com/c?m=9d78d513d98112ef19ba837e7c419726441497634d8787412294c45f931507061831a3...
  • xiao_ke_ni
  • xiao_ke_ni
  • 2012年09月19日 18:57
  • 601
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++语言中的细节_2
举报原因:
原因补充:

(最多只允许输入30个字)