导航

上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 37 下一页

2014年4月4日

摘要: 在C++中,基类必须指出希望派生类重新定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。引用和指针的静态类型与动态类型可以不同,这是C++用以支持多态性的基石。通过基类引用或指针调用基类中定义的函数时,我们并不知道执行函数的对象的确切类型,执行函数的对象可能是基类类型的,也可能是派生类型的。如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数,如果调用虚函数,则直到运行时才能确定调用哪个函数,运行的虚函数是引用所绑定的或者指针所指的对象所属类型定义的版本。 阅读全文

posted @ 2014-04-04 16:40 网名还没想好 阅读(297) 评论(0) 推荐(0) 编辑

2014年4月3日

摘要: 针对const_cast,太多人在用同一个示例问同一个问题:void main(){const int a = 3;const int *pc = &a;int *p = const_cast(&a);*p = 5;printf("%d,%d,%d",*p,*pc,a); //结果是 5,5,3}最终输出的a,为何是3而不是5?C++对用const定义的常数变量,不是靠地址空间中的内容来取数的,而是靠保存在符号表中的索引来取数的,因此常数变量a无论什么情况下使用都是常数3。事实上,变量a地址空间中的内容确实是5,但即使你*(&a)来取数仍是3。你可以 阅读全文

posted @ 2014-04-03 18:03 网名还没想好 阅读(252) 评论(0) 推荐(0) 编辑

摘要: C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。四种转换的区别:static_cast:可以实现 阅读全文

posted @ 2014-04-03 17:47 网名还没想好 阅读(357) 评论(0) 推荐(0) 编辑

2014年4月2日

摘要: 1,C++在定义函数重载的时候形参不管是不是const的他们都是等价的,除非形参是const引用。举个例子:void fun(int a){...}与void fun(const int a){...}是等价的,这样重载会报错说redefinition。void fun(int &a){...}与void fun(const int &a){...}这样就是正确的。2,不能从const成员函数返回指向类对象的普通引用,const成员函数只能返回*this作为一个const引用。const test_const &fun()const{...;return *this} 阅读全文

posted @ 2014-04-02 14:51 网名还没想好 阅读(452) 评论(0) 推荐(0) 编辑

2014年4月1日

摘要: 我们先看一段代码: 建立people.cpp 文件,然后输入下列内容:class People{ public: int age; explicit People (int a)//加上了explict关键字的构造函数 { age=a; }};void foo ( void ){ People p1(10); //方式一 People p3=10; //方式二} 在 C++ 中, 如果一个类有只有一个参数的构造函数,C++ 允许一种特殊的声明类变量的方式。在上面的方式二: 写下如People p3=10这样的代码,且恰好10的类型(整型int)正好是people类单参数构造函数的参数类型,这时 阅读全文

posted @ 2014-04-01 14:22 网名还没想好 阅读(367) 评论(0) 推荐(0) 编辑

摘要: 问题:现有类A定义如下:class A{public: A(int a) //构造函数 { m_a = a; cout<<"constructor"<<endl; } A(const A &d) //复制构造函数 { m_a = d.m_a; cout<<"copy constructor"<<endl; } A& operator=(const A &oA) //重载赋值操作符 { m_a = oA.m_a; cout<<"operator="< 阅读全文

posted @ 2014-04-01 13:55 网名还没想好 阅读(790) 评论(0) 推荐(0) 编辑

2014年3月29日

摘要: 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).那么显示声明的构造函数和隐式声明的有什么区别呢? 我们来看下面的例子:classCxString//没有使用explicit关键字的类声明,即默认为隐式声明{public:char*_pstr;int_size;CxString(intsize){_size=size;//string的预设大小_pstr=malloc(size+1);//分配strin 阅读全文

posted @ 2014-03-29 16:03 网名还没想好 阅读(79334) 评论(15) 推荐(35) 编辑

2014年3月28日

摘要: 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:class CExample{public: int a; float b; CExample():a(0),b(8.8){} CExample(){ a=0; b=8.8; } }; 上面例子中两个构造函数的结果是一样的。上面的构造函数(使用初始化列表的构造函数)显示地初始化类的成员;而没有使用初始化列表的构造函数式对类的成员赋值,并没有进行显示地初始化。初始化和赋值... 阅读全文

posted @ 2014-03-28 13:36 网名还没想好 阅读(608) 评论(0) 推荐(0) 编辑

2014年3月26日

摘要: 原文地址:http://hi.baidu.com/quanhaili/blog/item/5a40ba86b37e1b22c65cc38f.html类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。静态类成员包括静态数据成员和静态函数成员两部分。一 静态数据成员:类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:1.静态数据成员的定义。静态数据成员实际上是类域 阅读全文

posted @ 2014-03-26 17:07 网名还没想好 阅读(196) 评论(0) 推荐(0) 编辑

2014年3月22日

摘要: 写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错! 我们先来看一些代码及其编译结果。 实例一: #include "stdafx.h" #include class CB { public: void f(int) { cout class CB{public: virtual void f(int) { cout c... 阅读全文

posted @ 2014-03-22 09:39 网名还没想好 阅读(228) 评论(0) 推荐(0) 编辑

上一页 1 ··· 18 19 20 21 22 23 24 25 26 ··· 37 下一页