C++语言学习
文章平均质量分 66
giveable-coding
这个作者很懒,什么都没留下…
展开
-
怎么防止类被继承?对于不能被继承的类,怎么初始化及销毁它的实例?
<br />“怎么防止类被继承?对于不能被继承的类,怎么初始化及销毁它的实例?”这是ADOBE公司的一道笔试题。<br />看了这道题目,笔者查阅了一些资料并结合自己的一些想法,写了这篇博客,有错误的地方请指出,谢谢。<br />首先看怎么防止类被继承。这里面介绍一种借用虚继承和友元机制实现的方法。其实说到底,防止一个类被继承,我们还是想怎么使的派生类在构造时不能够调用基类的构造函数,从而不能完成继承。我们都知道,派生类对象初始化时,首先要运行基类构造函数,将基类子对象进行初始化,之后再运行派生类的构造函数原创 2011-05-11 13:17:00 · 2552 阅读 · 1 评论 -
C++ 学习之构造函数:构造函数小结3 默认构造函数、隐式类型转换和复制构造函数
构造函数中的这三个概念对于我这个初学者是需要时间和耐性去好好体会理解的。对于默认构造函数,大家的第一印象好像总是认为这样的,例如有一个类Aclass A{public: A():a(0),b(2.09) {}private: int a ; double b; string str;};好像总以为默认构造函数都是形参表中没有形参的那种。但事实上还有一种默认构造函数他是有形参的,只不过其中的形参都带有默认实参。如class A{public: A(int c=0, do原创 2011-04-13 13:41:00 · 2875 阅读 · 0 评论 -
C++ 学习之操作符重载
<br />C++中重载操作符其实是一个有特殊名称的函数:关键字operator后加上想要重载的符号,重载操作符同样需要有返回值类型和形参列表。<br />操作符重载一般有以下几点需要注意的:<br />1)重载操作符必须有一个类类型的操作数,这是为了避免对已有的内置类型对象的操作符的原本含义的更改;<br />2)重载后的操作符的优先级和结合性是固定不变的;<br />3)重载操作符为类成员函数时,它的形参表中会少一个形参,原因是有一个隐含形参this,而且该this形参限定为第一个操作数;<br />4原创 2011-04-14 12:57:00 · 1165 阅读 · 0 评论 -
C++ 学习之继承1:基类与派生类
<br />面向对象编程OOP(object-oriented programming)的关键思想是多态性。C++中多态性用于通过继承而相关联的类型的引用或指针。<br />首先看看基本的基类和派生类,以C++ primer中一个程序段为例:<br /><br />在基类Item_base中我们可以看到,这里面存在public、protected和private三种访问控制标号。public成员可以被一切用户代码所访问;protected成员可以由基类及派生类访问,但不能由普通用户代码访问;private成原创 2011-04-15 15:02:00 · 661 阅读 · 0 评论 -
C++ 学习之模板
<br /> 泛型编程就是以独立于任何特定类型的方式编写代码。它也是一种多态的应用,它可以使一个类或者一个函数操纵不同类型的对象。模板是泛型编程的接触。下面是个人对模板学习的一点总结。<br />1.函数模板<br />函数模板的定义以关键字template开始,后面接模板形参表,然后是函数返回类型,函数名称,函数形参表,函数体。例如:<br />template <class T,size_t N> void array_init(T (&parm)[N]) {<br />原创 2011-04-19 14:01:00 · 601 阅读 · 0 评论 -
C++ 学习之深拷贝与浅拷贝
<br />深拷贝与浅拷贝这个问题在面试中很喜欢出现啊!自己也懂一些,但是说的不够准确,看到一篇写的不错的博客,转载了。<br />Q:什么是浅拷贝(shallow copy)和深拷贝(deep copy)? <br />A: <br />浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,转载 2011-04-26 16:37:00 · 738 阅读 · 0 评论 -
虚函数 析构函数 抽象类
1. 析构函数和虚析构函数 如果基类的析构函数是虚的,那么它的派生类的析构函数都是虚的 这将导致:当派生类析构的时候,它的所有的基类的析构函数都将得到调用 否则,只调用派生类的析构函数(这可能导致基类的某些对象没有得到释放) 所以CObject类的析构函数是虚的,所有由它派生的类析构的时候一级一级的进行,不会造成内存泄漏。 无论基类的析构函数是否为虚析构函数. 基类的析构函数总是会被自动调用的;但是, 如果用基类指针去操作一个了派生类对象,如果不转载 2011-05-09 15:32:00 · 804 阅读 · 0 评论 -
C++中extern "C"用法
前天去笔试百度,就一道题是考C++中的语言语法问题的,还是我不会的,悲剧啊,题目大致是这样的:extern“c”{是什么含义,有什么作用??无语啊,以前没用过。。。回来之后开始在网上找答案。看了两篇博客,受益匪浅。第一篇:http://tech.163.com/06/0118/09/27O66HCC0009159Q.html第二篇:http://blog.csdn.net/bisword/archive/2009/02/19/3910824.aspx第一篇内容:时常在cpp的代码之中看到这样的代码: #if转载 2011-05-10 12:24:00 · 842 阅读 · 0 评论 -
C++学习之虚函数
初学C++,虚函数这部分感觉博大精深啊。C++正是通过虚函数实现了多态。在C++中,以virtual关键字开始的函数是虚函数,虚函数是基类希望派生类进行重新定义的函数,不希望派生类重新定义而完全继承的不要定义为虚函数。一旦函数在基类中声明为虚函数,派生类就无法改变这个事实,派生类原创 2011-04-17 20:13:00 · 923 阅读 · 0 评论 -
C++ 学习之构造函数:构造函数小结2 构造函数初始化列表
构造函数初始化列表以一个冒号:开始,接着是一个以逗号分隔的数据成员列表,每个数据成员后面跟着一个圆括号的初始化式。在日常使用中,构造函数初始化列表可以使用,也可以省略。此时要弄清楚构造函数执行其实是分为两个阶段的:1)初始化阶段;2)普通的计算阶段阶段。初始化阶段:初始化列表中显示初始化的成员按照列表中圆括号内的值初始化,而对于初始化列表中没有显式列出的成员,若是类成员,则调用该类型的默认构造函数初始化,若是内置类型或者复合类型,则按照变量初始化的原则,在局部作用域中的不做初始化,全局作用于中的初始化为0。原创 2011-04-12 12:26:00 · 765 阅读 · 0 评论 -
C++学习之main函数以及带形参的main函数
C++程序包含一个或者多个函数,但是必须有一个函数被命名为main函数。操作系统通过调用main函数来执行程序,main函数是操作系统唯一显式调用的函数。main函数在执行结束后会返回给操作系统一个值,该值必须是int型的,通常返回值0代表程序执行成功,而其它返回值在操作系统中也有相应的含义。 通常我们使用的main函数都是不用带形参的,但其实main函数也是可以带形参的。在C/C++语言中,main()函数有参数形式:int main(int argc,char *argv[]) 或者原创 2011-04-07 14:07:00 · 4883 阅读 · 1 评论 -
C++ 学习之函数重载、基于const的重载
<br />函数重载<br />函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载。注意函数重载不能基于不同的返回值类型进行重载。<br />注意函数重载中的“形参表”不同,是指本质不同,不要被一些表象迷惑。main函数不能被重载。<br />下面三组定义本质是相同的,不是重载:<br />1)int sum (int &a); 和 int sum (int &);<br />2) int sum (int a) 和 int sum (const int a);<原创 2011-04-07 19:09:00 · 7649 阅读 · 2 评论 -
C/C++内存管理详解
[我觉得这是一篇很不错的文章,对C和C++的程序员来说,很有实用价值,故推荐给大家]作者:PingPong 文档来源:CSDN伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 1、内存分配方式转载 2011-05-10 14:11:00 · 539 阅读 · 0 评论 -
C++中Static作用和使用方法
#include class Point{public:void output(){ }static void init(){ x = 0; y = 0;}private:static int x;static int y;};int Point::x = 0;int Point::y = 0;void main( void ){Point::init();}1、什么是static? static转载 2011-05-15 18:53:00 · 874 阅读 · 1 评论 -
sizeof用法,详解,终极无惑(上)
CSDN上看到了sizeof的一篇好文章,转来好好看看,选自CSDN博客:http://blog.csdn.net/freefalcon/archive/2004/07/28/54839.aspx0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下。但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章。但如果你想“知其然,更知其所转载 2011-05-16 23:20:00 · 784 阅读 · 0 评论 -
关于迭代器失效的一些认识
<br /> 众所周之当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作:<br />iter=vec.insert(iter); iter=vec.erase(iter); <br /> 想想究竟为什么迭代器实效,原因也不难理解。以vector为例,当我们插入一个元素时它的预分配空间不够时,它会重新申请一段新空间,将原空间上转载 2011-05-18 14:04:00 · 787 阅读 · 0 评论 -
C++ 学习之函数传参1:引用传参和非引用传参
个人认为C++函数传参的一个指导性原则是:若函数的形参是非引用类型,传参时实际上是使用复制实参的值给形参,是实参值的副本,而非真正的实参;若函数的形参是引用类型的,则传递的其实就是实参本身,形参只不过是实参本身的别名而已。1.非引用类型的形参(牢记关键词——复制实参的副本)永远不要忘记传递进来的是实参的副本,与实参本身并无“太多直接”关系。在使用非引用类型形参的时候,如果不需要对实参本身做修改,则直接传递即可。此时const形参,非const形参的值初始化问题五特殊要求,它们只是想用实参的副本值来初始化自己原创 2011-04-02 13:15:00 · 4366 阅读 · 0 评论 -
C++ 学习之函数传参2:vector和数组传参
前面一篇博客讲到了在函数的传参中数组是不能依靠复制传递的,而vector是可以复制的,但是由于vector中通常会含有很多元素,为了避免大量的复制,可以将容器实参以引用的方式避免复制。下面主要讲讲在实际当中,对数组和容器的传参的习惯手法。1.数组传参1)使用指针传参(数组除了不能够具有直接复制的特性,还有一个特性,就是数组名通常情况下会自动转化为指向其第一个元素的指针)具体形式有void size_array( int *);void size_array( int array[]);void原创 2011-04-02 13:52:00 · 6220 阅读 · 0 评论 -
C++ 学习之函数:问题杂谈
下面总结几个关于函数部分知识的问题,也是自己在学习过程中概念不太清楚的东东。1.函数返回值当函数要返回一个引用时,千万别返回函数中的局部对象的引用,因为函数执行完会被释放,局部对象会被释放,因此对局部对象的引用将会指向不确定的内存;当函数返回一个指针的时候,千万别返回函数中的指向局部对象的指针,会引起悬垂指针问题。2.函数声明和默认实参函数原型是指返回类型,函数名,和形参表。当函数仅仅是声明的时侯,形参可以仅仅表明类型,不用有形参名。、默认实参是指给函数的形参表中的形参提供明确的初始值来制定的。如果一个形参原创 2011-04-02 15:55:00 · 672 阅读 · 0 评论 -
C++ 学习之文件的读写
对于C++文件的读写,个人认为关键之处在于牢记“文件流对象和文件的绑定是否正常”要想读写文件,必须先定义文件的流对象,并且将定义的流对象与想要处理的文件进行绑定。对文件进行绑定,少不了涉及文件名称。在C++中,文件名作为实参要求是C风格的字符串,而不是C++中的string类对象。通常的处理方法是用直接初始化的方法,括号中是C风格字符串;或者是将文件名赋值给一个string类对象,然后再调用c_str()成员函数进行转化。例如:string filename = "d://f1.txt";fstream F原创 2011-04-03 14:45:00 · 1276 阅读 · 1 评论 -
C++ 学习之构造函数:构造函数小结1
谈到C++的类,就必然少不了构造函数这个概念,下面是自己学习C++ primer后对构造函数一些知识点的总结和理解在创建类对象的时候,必然要执行构造函数,构造函数的功能是保证每个对象的数据成员具有合适的初始化。构造 函数是特殊的成员函数,它的名字与类型名称相同,而且没有返回值原创 2011-04-12 10:50:00 · 867 阅读 · 0 评论