C++之技术
文章平均质量分 62
面向对象 修修补补
用心做好每一件事
展开
-
只能定位出任何数组尾部之后的那一个元素的地址
1.不能定义一个返回类型与参数类型无关的函数。否则很多编译器无法通过编译。(虽然C++标准委员会已经批准了一种方式,允许返回类型不同于任何模版参数类型,但是,很少有编译器支持该方式)例如:template T sum(Iter it) {/*...*/}94.C和C++语言保证(且只能保证)能够定位超出了任何数组尾部之后的那一个元素的地址。换句话说,就是以下的a+10原创 2014-04-16 22:25:08 · 692 阅读 · 0 评论 -
虚函数重载的相关问题
我们首先对下面三个常见的术语进行区分:①对函数f()进行重载(overload)是表示,在相同的作用域中定义另一个相同的名字(f)的函数,并且这个函数与f()有着不同的参数个数和参数类型。当程序调用函数f()时,编译器将会根据实际提供的参数来选择最匹配的函数。②对虚函数f()进行覆盖(override)是表示,在派生类中定义一个相同的名字(f)的函数,并且这个函数的参数个数和参数类型与f(原创 2014-07-21 00:02:55 · 924 阅读 · 0 评论 -
类在编写过程中的一些注意事项
在编写类的时候我们要很好的把握细节问题,不仅仅要去避免一些明显的错误,更多的是如何形成良好的编程风格。下面我们将从下面的一个例子分析类的编写技巧:class Complex{public: Complex(double real,double imaginary = 0):_real(real),_imaginary(imaginary){ } void operato原创 2014-07-21 00:06:15 · 1028 阅读 · 0 评论 -
malloc、calloc、realloc三者的区别
1、malloc作用:分配内存块原型:void *malloc(size_t size);size表示要分配的字节数返回值:返回一个指向所分配空间的void指针,如果没有足够的内存可用,则返回NULL。 如果要返回一个指向特定类型的指针,则在返回值上用一个类型转换。例如: char* p; p=(char*)malloc(20)原创 2014-07-21 00:07:05 · 974 阅读 · 0 评论 -
mutable的用法
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。关键字mutable是原创 2014-05-26 23:02:50 · 1246 阅读 · 0 评论 -
const经典例子小结
在看这个例子之前,可以先看看:详解C和C++中的const和const和static变量的存放位置这样将会对const有非常全面的了解和认识:下面我们将通过下面的例子看看const的一些非常不易发觉的错误:#includeusing namespace std;class String{public: friend ostream& operator<<(ostream& os原创 2014-05-26 22:35:17 · 1244 阅读 · 0 评论 -
多重继承和虚基类
多重继承描述的是有多个直接基类的类。多重继承会带来两个主要的问题:①从两个不同的基类继承同名方法;②从两个或更多相关基类那里继承同一个类的多个实例。例如:class A{private: string name; int id;public: virtual void f();...};class B:public A{private原创 2014-07-28 00:15:59 · 1545 阅读 · 0 评论 -
虚函数相关问题分析
1、静态联编和动态联编将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在C语言中,这非常简单,因为每个函数名都对应于一个不同的函数。在C++中,由于函数重载的缘故,这项任务更复杂。编译器必须查看函数参数以及函数名才能确定使用哪个函数。然而,C/C++编译器可以在编译过程中完成这种联编。在编译过程中进行联编称为静态联编,又称为早期联编。不过虚函数使这项工作变得更困难。因为原创 2014-07-28 00:15:31 · 887 阅读 · 0 评论 -
C++中临时对象的产生与运用
所谓临时对象就是一种无名对象。它的出现如果不在程序员的预期之下(例如任何pass by value操作都会引发copy操作,于是形成一个临时对象),往往照成效率上的负担。但有时候可以制造一些临时对象,却又使程序干净清爽的技巧。刻意制造临时对象的方法是,在型别名称之后直接加一对小括号,并可指定初值,例如int(8),其意义相当于调用相应的constructor,且不指定对象名称。STL最原创 2014-06-18 23:16:39 · 940 阅读 · 0 评论 -
静态常量整数成员在class内部直接初始化
如果class内含const static integral data member,那么根据C++标准规格,我们可以在class之内直接给予初值。所谓integral泛指所有整数型别,不单只是指int。例如:#include #include #include using namespace std; template原创 2014-06-18 23:33:25 · 854 阅读 · 0 评论 -
类设计中三种继承方式
通过继承能够从已有的类派生出新的类,而派生类继承了基类的特征,包括方法。正如继承一笔财产要比自己白手起家容易一样,通过继承派生出的类通常比设计新类要容易得多。下面是可以通过继承完成的一些工作。①可以在已有类的基础上添加功能。②可以给类添加数据。③可以修改类方法的行为。C++有三种继承方式:公有继承、保护继承和私有继承。一、公有继承公有继承是最常用的方式,它建立一种i原创 2014-07-28 00:13:59 · 1556 阅读 · 0 评论 -
C++中如何获取类成员的指针
我们都知道C++ class中有三种成员函数,static(静态的),nonstatic(非静态的),virtual(虚拟的)各种成员函数的指针各有区别,以下是一个完整的例子:(注意红颜色的区别)class A {public: static void staticmember(){cout void nonstatic(){cout virtual原创 2014-08-08 00:14:43 · 1583 阅读 · 0 评论 -
用C++设计一个不能被继承的类
在 C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。 template class A{ friend T; private: A(原创 2014-08-08 00:11:36 · 768 阅读 · 0 评论 -
C++类的底层机理
我们首先从一个问题来阐明类的底层机理:假如有一个类A,里面有一个成员函数get(),例如:class A{public: void get();}A a;那么a.get()表示什么呢?首先给出答案是get(&a),因为在类的底层机制中,成员函数的第一个参数都是一个指向该类数据结构的指针(静态成员函数除外),所以成员函数get()的存在形式为void g原创 2014-08-10 00:27:36 · 1423 阅读 · 0 评论 -
C++中的四种转型操作符
在详细介绍C++中的四种转型操作符之前,我们先来说说旧式转型的缺点:①它几乎允许将任何类型转换为任何其他类型,这是十分拙劣的。如果每次转型都能够更精确地指明意图,则更好。②旧式转型难以辨识。旧式转型的语法结构是由一对小括号加上一个对象名称组成,而小括号和对象名称在C++的任何地方都有可能被使用。为解决C旧式转型的缺点,C++导入了4个新的转型操作符:static_cast、const_原创 2014-08-11 00:09:24 · 951 阅读 · 0 评论 -
C++中volatile关键字的分析
volatile关键字表明,即使程序代码没有对内存单元进行修改,其值也可能发生变化。例如,可以将一个指针指向某个硬件位置,其中包含了来自串行端口的时间或信息。在这种情况下,硬件(而不是程序)可能修改其中的内容。或者两个程序可能互相影响,共享数据。该关键字的作用是为了改善编译器的优化能力。例如,假设编译器发现,程序在几条语句中两次使用了某个变量的值,则编译器可能不是让程序查找这个值两次,而是将这个值原创 2014-06-07 14:52:49 · 1721 阅读 · 0 评论 -
详解C和C++中的const关键字
在讲下面的内容之前,要先看看这篇文章const、static变量的存储位置一、C中的const作用:(1)可以定义const常量,具有不可变性。 (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。 (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变! (4)可以保护原创 2014-05-21 22:48:18 · 951 阅读 · 0 评论 -
返回类型与参数类型的关系
注意不能定义一个返回类型与参数类型无关的函数。否则很多编译器无法通过编译。(虽然C++标准委员会已经批准了一种方式,允许返回类型不同于任何模版参数类型,但是,很少有编译器支持该方式)例如:template T sum(Iter it) {/*...*/}原创 2014-04-16 22:27:56 · 736 阅读 · 0 评论 -
自定义一个动态数组
当我们需要一个动态数组时可以根据自己的需要量身定制,很不错哦!原创 2014-04-16 23:13:29 · 902 阅读 · 0 评论 -
单元素模式返回实例
89.希望有且只有一个类的实例返回给调用程序时,就可以使用单元素模式(Singleton Pattern)。这种类的声明如下: class TheOnlyInstance { public: static TheOnlyInstance* GetTheOnlyInstance(); //other methods protected: TheOnl原创 2014-04-16 22:22:02 · 538 阅读 · 0 评论 -
请说明new operator和operator new之间的差异
请说明new operator和operator new之间的差异原创 2014-04-19 18:10:10 · 1179 阅读 · 0 评论 -
如果编译器尚未支持bool,有两种方法可以模拟
如果编译器尚未支持bool,有两种方法可以模拟原创 2014-04-19 09:59:34 · 1214 阅读 · 1 评论 -
所谓虚构造函数
所谓虚构造函数原创 2014-04-19 18:23:08 · 767 阅读 · 0 评论 -
静态/编译期断言的三种机制
静态/编译期断言的三种机制原创 2014-04-19 09:16:58 · 934 阅读 · 0 评论 -
怎样判断两个变量数据类型一致
怎样判断两个变量数据类型一致,见识模板的魅力。原创 2014-04-19 09:48:34 · 1348 阅读 · 0 评论 -
虚继承和虚基类的本质
虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然这两个概念的定义是非常的简单明确的,但是在C++语言中虚继承作为一个比较生僻的但是又是绝对必要的组成部份而存在着,并且其行为和模型均表现出和一般的继承体系之间的巨大的差异(包括访问性能上的差异),现在我们就来彻底的从语言、模型、性能和应用等多个方面对虚继承和虚基类进行研究。 首先还转载 2014-04-20 14:28:35 · 657 阅读 · 0 评论 -
auto_ptr的使用及其源代码
auto_ptr的使用及其源代码原创 2014-05-15 21:37:27 · 1017 阅读 · 0 评论 -
inline函数的使用方法
inline函数的使用方法原创 2014-05-15 22:05:11 · 1389 阅读 · 0 评论 -
函数模板注意事项
一、模板重载原创 2014-06-03 23:01:13 · 972 阅读 · 0 评论 -
友元在继承和传递中的一些问题
声明:①友元关系不能被继承和传递,基类的友元对派生类没有特殊的访问权限,派生类中的友元更不能访问基类中的成员。 ②友元不是成员函数,所以不能使用作用域解析符来指出要使用哪个函数。这个问题的解决方法是使用强制类型转换,以便匹配原型时能够选择正确地函数。 ③基类的友元能够访问派生类中的基类成分,这是由于自动将派生类转化成了基类,不是因为继承,但是不能访问原创 2014-05-23 19:27:35 · 1341 阅读 · 0 评论 -
C++编译器最烦人的分析机制
下面这行代码声明了一个带double参数并返回int的函数:int f(double d);下面这行做了同样的事情,参数d两边的括号是多余的,会被忽略:int f(double (d));下面这行声明了同样的函数,只是它省略了参数名称:int f(double);这三种形式除了第二种,我们应该都很熟悉。下面我们在看三个函数声明。第原创 2014-06-25 22:45:40 · 761 阅读 · 0 评论 -
引用和指针的区别
引用(references)使用“.”操作符,指针(pointers)使用“*”和“->”操作符,这是两者最基本也是最熟悉的区别了,应该不用详说。首先,没有所谓的null reference。一个reference必须总代表某个对象,因此C++要求references必须有初值:string& rs;//错误!references必须被初始化string s("xyzzy");st原创 2014-08-11 00:09:52 · 902 阅读 · 0 评论