随笔分类 -  C++

摘要:http://bbs.csdn.net/topics/330094483 阅读全文
posted @ 2013-03-20 23:24 小薇林 阅读(244) 评论(0) 推荐(0)
摘要:[C++基础]037_编写不可被继承的类 1. 現実场景 在很多电影电视剧里,武功最高的往往是太监,所谓“欲练此功,必先自宫”,太监的武功为什么会这么高?我想应该是闲的。如果说面向对象的世界里有父子的话,那么太监这个类应该就是无法生子的类。他们是无法被继承的,不过,他们是可以继承别人的。 2. 技術問題 要实现一个无法被继承的类,Java为我们提供了一个关键字final,但是C++里没有,那作为C++程序员如何写出一个无法被继承的类呢?构造函数和析构函数。 为什么C++的构造函数和析构函数能够实现这点呢?因为C++的类继承里有一个规则,就是子类在实例化的时候,必须先调用父类的构造函数。对... 阅读全文
posted @ 2013-03-20 17:42 小薇林 阅读(166) 评论(0) 推荐(0)
摘要:在使用C++编程的过程当中,常常需要对类成员进行初始化,通常的方法有两种: 第一种方法:CMYClass::CSomeClass() { x=0; y=1; }第二种方法: CSomeClass::CSomeClass() : x(0), y(1) { }本文将要探讨这两种方法的异同以及如何使用这两种方法。 从技术上说,第二种方法比较好,但是在大多数情况下,两者实际上没有什么区别。第二种语法被称为成员初始化列表,之所以要使用这种语法有两个原因:一个原因是必须这么做,另一个原因是出于效率考虑。 让我们先看一下第一个原因——必要性。设想你有一个类成员,它本身是一个类或者结构,而且只有... 阅读全文
posted @ 2013-03-20 17:34 小薇林 阅读(200) 评论(1) 推荐(0)
摘要:[C++基础]035_指针函数与函数指针<详细讲解>1. 前言 关于指针函数和函数指针,特别是函数指针,相信很多C/C++ers跟我曾经一样,对它抱有敬畏,认为它是很高深的东西,其实不然。要理解它花不了多少功夫,或许我一句话就能说清楚二者的区别,但是这样也只是在脑子里形成一个概念而已。大学时代,作为一名学生时,我可以一天看完毛概,考八九十分;但是我用了一个星期去看谭浩强的C++教材(尽管现在很多人鄙视这本教材),上机时却仍无从下手,我可以侃侃而谈,熟悉一切概念,但是就是编不出程序。这就是程序员的世界,凡事只有动手才能领悟真谛。不过这也应证了一句千古名句,也是我最喜欢的一句诗“纸上得 阅读全文
posted @ 2013-03-20 17:03 小薇林 阅读(248) 评论(0) 推荐(0)
摘要:[C++基础]034_C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)1. 主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template<class T1, class T2> 5 class A{ 6 public: 7 void function(T1 value1, T2 value2){ 8 cout<<"value1 = "<<value1<<endl; 阅读全文
posted @ 2013-03-20 16:43 小薇林 阅读(258) 评论(3) 推荐(0)
摘要:[C++基础]033_深入C++的new1. New的本质当使用关键字new在堆上动态创建一个对象时,它实际上做了三件事: ①获得一块内存空间 ②调用类构造函数 ③ 返回指向地址的正确指针如果创建的是简单类型的变量,第二步就不执行了。下面我们看一段代码:按 Ctrl+C 复制代码#include <iostream> using namespace std; class A { int m_value; public: A(int value) :m_value(value * value){} void Func(){ printf("m_va... 阅读全文
posted @ 2013-03-20 16:40 小薇林 阅读(207) 评论(0) 推荐(0)
摘要:[C++基础]032_常用的字符串处理函数(strcat,strcpy,strcmp,strupr,strlwr,strlen)1. strcat——字符串连接 1 #include <iostream> 2 using namespace std; 3 4 int main(){ 5 6 char str[15] = "abcd"; 7 char str1[] = "abc"; 8 strcat(str, str1); 9 cout<<str<<endl;10 11 system("pause") 阅读全文
posted @ 2013-03-20 00:57 小薇林 阅读(440) 评论(0) 推荐(0)
摘要:[C++基础]031_如何正确获取用户的输入1. 获取输入的第一个程序 1 #include <iostream> 2 using namespace std; 3 4 int main(){ 5 6 char str[15]; 7 cin>>str; 8 cout<<str<<endl; 9 10 system("pause");11 return 0;12 }上面的程序可以获取用户的输入,但是如果用户输入如下字符串:abcd cdef输出结果不是我们想要的“abcd cdef”,而是“abcd”。这说明cin认为空格是字符 阅读全文
posted @ 2013-03-20 00:55 小薇林 阅读(1130) 评论(2) 推荐(0)
摘要:[C++基础]029_C++学习之路看了一个多星期的C++,找了很多博客来计划铺垫未来C++学习之路,发现C++的水不是一般的深,虽然没有J2EE里面的各种框架,但是其本身已极尽复杂。个人才踩到了一点水皮,下面是摘录的一些博客上的内容,有需要学C++的,一起学习:C++高手需知知识(其中一部分,但有代表性)虚函数是什么函数?为什么需要虚函数?普通基类和虚基类的区别是什么?虚继承的作用是什么?什么是虚函数表?在多重继承关系下,虚函数表是如何存储虚函数关系的?如何通过虚函数表分析设计安全性?什么是菱形继承?菱形继承的内存布局是怎样的?菱形继承会导致什么问题?如何避免菱形继承带来的问题?什么是静态联 阅读全文
posted @ 2013-03-20 00:48 小薇林 阅读(295) 评论(0) 推荐(1)
摘要:[C++基础]028_获取类成员函数的指针 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 static void staticmember(){cout<<"static"<<endl;} 8 void nonstatic(){cout<<"nonstatic"<<endl;} 9 virtual void virtualmember(){cout<<"virtual&quo 阅读全文
posted @ 2013-03-20 00:47 小薇林 阅读(204) 评论(0) 推荐(0)
摘要:关于typedef的用法总结 不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb;// 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,// 和一个字符变量;以下则可 阅读全文
posted @ 2013-03-20 00:28 小薇林 阅读(220) 评论(0) 推荐(0)
摘要:[C++基础]024_虚函数面向对象的核心:封装、继承、多态。其中多态又分为编译时多态和运行时多态。 编译时多态(静态联编):利用函数重载实现 运行时多态(动态联编):利用虚函数实现虚函数就是被关键字virtual修饰的类成员函数,它是动态联编的核心。 1. 虚函数只能是类的成员函数,并且在发生类的继承时发生作用,普通函数不能用virtual修饰。 2. 虚函数不能是static的,虚函数决定了多态,它是属于对象的,不能是唯一的。 3. 析构函数最好是虚函数,以确保在继承时,子类的析构函数也被调用。下面是虚函数的例子: 1 #include <iostream> 2 using n 阅读全文
posted @ 2013-03-20 00:13 小薇林 阅读(191) 评论(1) 推荐(0)
摘要:[C++基础]023_为什么要将基类的析构函数声明为Virtual? 1 #include <iostream> 2 using namespace std; 3 4 class Father{ 5 6 public: 7 ~Father(){ 8 cout<<"Father's Desconstruct Called."<<endl; 9 }10 };11 12 class Son : public Father{13 public:14 ~Son(){15 cout<<"Son's Descons 阅读全文
posted @ 2013-03-19 14:38 小薇林 阅读(309) 评论(1) 推荐(0)
摘要:[C++基础]021_浅拷贝和深拷贝浅拷贝:即类中有指针成员变量,拷贝时,只拷贝了指针变量,而没有拷贝指针变量所指向的地址块。实例代码: 1 #include <iostream> 2 using namespace std; 3 4 class Tree{ 5 public: 6 // 拷贝构造函数 7 Tree(const Tree& tree){ 8 this->num = tree.num; 9 }10 // 构造函数11 Tree(){12 num = new int(10);13 }14 //... 阅读全文
posted @ 2013-03-19 14:23 小薇林 阅读(168) 评论(0) 推荐(0)
摘要:C++0x引入了很多令人兴奋的好东西,其一便是右值引用。右值引用到底是什么意思呢?而与因此被命名为左值引用的用法有什么不同呢?本文将为你揭晓。 阅读全文
posted @ 2013-03-19 00:35 小薇林 阅读(210) 评论(0) 推荐(0)
摘要:[C++基础]019_指针和引用(int*、int&、int*&、int&*、int**)相信很多CPPers跟我一样,曾经在指针和引用里徘徊了很久很久。经常弄混指针和引用,尤其是见到如题中列出那些用法,着实是伤脑经。后来,在项目中用着用着,就能搞清楚区别了,算是会用吧。然而,对于一个Programmer,最忌讳的就是不知其所以然,会用和懂是两番天地。停留在会用的人,始终是原地打转;而懂的人,一通百通,能举一反三。本文,就如题的指针和引用的用法做一个介绍。首先我们来普及一下概念,说明一下什么是指针和引用,这里借用一下变量名作为过渡。 ■指针 ---- 指向某一块内存的变 阅读全文
posted @ 2013-03-19 00:14 小薇林 阅读(401) 评论(3) 推荐(0)
摘要:[C++基础]018_常量指针和指向常量的指针先来看一下什么是常量指针,什么是指向常量的指针吧!1. 常量指针定义1 int * const ptr = new int();2. 指向常量的指针1 const int* ptr;上面已经看到常量指针和指向常量的指针是如何定义的了,那么他们有什么特点呢?1. 常量指针无法改变指针的值,即无法改变该指针指向的地址。因此,在定义常量指针的时候,必须要为其指定一个地址。即代码中的new int()。2. 指向常量的指针所指向的值是无法更改的,即不能修改,不能销毁。如果对指向常量的指针进行delete操作的话,编译阶段就会报错。上述二者的组合是什么呢.. 阅读全文
posted @ 2013-03-19 00:09 小薇林 阅读(216) 评论(0) 推荐(0)
摘要:[C++基础]017_数据的存放学习写程序,就不能不对程序的数据存放有一定的了解。可能你常常听说栈啊、堆啊什么的,下面咱们看看数据的存放有哪几个位置。①.栈区 存储【函数参数】以及【局部变量】,由编译器自动分配和释放②.堆区 存储程序员动态创建的对象,由程序员创建和释放③.寄存器区 存储栈顶指针(SP)和指令指针(IP),由操作系统负责④.全局区(静态区) 存储全局变量(静态变量),由操作系统负责,一般程序运行结束销毁⑤.文字常量区 存储常量字符串,比如代码中定的“HelloWorld”等,由操作系统负责⑥.程序代码区 存储代码段内容,学过汇编的... 阅读全文
posted @ 2013-03-19 00:03 小薇林 阅读(197) 评论(0) 推荐(0)
摘要:[C++基础]016_内联函数到底有没有被嵌入到调用处呢?关于内联函数,我们所看到的大部分书籍都是如下描述的,当然,这是我个人的语言:内联函数是什么函数呢?直接了当的说,就是用inline关键字修饰的函数,不管是全局函数,还是成员函数,只要被inline关键字修饰,它就是内联函数。内联函数与其他普通的函数有什么区别呢?内联函数在生成可执行文件时,其代码块是直接嵌入到调用处的。它与宏非常类似。当然,是否以嵌入方式存在,由编译器决定。内联函数的核心作用是利用减少函数调用的产生开销来提高程序的性能。一句话,内联函数因为把代码直接嵌入到调用处,省略了函数调用这一步,无需初始化栈,保存寄存器等等,因而节 阅读全文
posted @ 2013-03-18 23:56 小薇林 阅读(334) 评论(0) 推荐(0)
摘要:[C++基础]015_循环的始祖gotoC++依旧支持goto的,怎么能不支持goto呢?有时候goto真的相当有效率~~ 1 #include <iostream> 2 using namespace std; 3 4 int main(){ 5 int i = 0; 6 TAG:i++; 7 if(i < 10){ 8 goto TAG; 9 }10 return 0;11 }就这么简单,呵呵! 阅读全文
posted @ 2013-03-18 13:05 小薇林 阅读(166) 评论(0) 推荐(0)