随笔分类 - C++语法
摘要:这句话包含两部分的意思:第一部分是要考虑到所有成员变量,特别是后加入的,相应的拷贝构造函数和赋值运算符要及时更新;第二部分是在存在继承时,不要遗忘基类部分的复制。先看第一部分的意思,举个例子:1 class SampleClass2 {3 private:4 int a;5 public:6 SampleClass(const SampleClass& s):a(s.a)7 {}8 };这里只举了一个拷贝构造函数的例子,赋值运算符与之类似,如果这个时候又加了一个成员变量,比如double b,拷贝构造函数和赋值运算符就要相应地更新(构造函数...
阅读全文
摘要:直观的operator=是这样定义的: 1 class SampleClass 2 { 3 private: 4 int a; 5 double b; 6 float* p; 7 public: 8 SampleClass& operator= (const SampleClass& s) 9 {10 a = s.a;11 b = s.b;12 p = s.p;13 ...
阅读全文
摘要:这个条款很简单的说,先解释一下为什么赋值后还要有返回值,这是因为我们可以这样用连等:1 int x, y, z;2 x = y = z;注意等号是右结合的,所以上述运算实际上等同于:x = (y = z);如果没有返回值,上述代码就不能通过编译。至于为什么返回的是一个引用,这并不是编译器强制的,但有三个原因让你觉得这样做是明智的:(1) 返回引用可以节省资源,不必要为返回值调用构造函数了;(2) 形如(x = y) = 3这样的连等,编译器也能接受了,因为这样的写法要求赋值运算符返回的是可以修改的左值;(3) STL和boost库中的标准代码都是这样写的,为了与它们相兼容,还是放弃你的标新立异
阅读全文
摘要:先举一个在构造函数中调用virtual函数的例子: 1 class Base 2 { 3 public: 4 Base() 5 { 6 VirtualFunction(); 7 } 8 9 virtual void VirtualFunction()10 {11 cout << "In the Base Class" << endl;12 };13 };14 15 16 17 class Derived: p...
阅读全文
摘要:举书上的例子,有以下代码: 1 class Widget 2 { 3 public: 4 ~Widget(){…} // 析构函数 5 }; 6 7 void DoSomething() 8 { 9 vector<Widget> v;10 }STL的vector在析构时会逐一调用容器内每个元素的析构函数,这样问题就来了,万一在Widget的析构函数里出现了异常,又没有及时地在析构函数中处理这个异常,导致异常被抛出,因为vector中存在多个Widget元素,这样在析构时就会多次抛出未处理的异常,多个异常同时存在是非常危险的,它会导致不明确的行为。最好的解决...
阅读全文
摘要:严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态。下面我们来举有关C++多态的一个简单例子: 1 class Shape 2 { 3 private: 4 int color; 5 public: 6 virtual void print() = 0; 7 }; 8 9 10 class Circle: public Shape11 {12 private:13 double radius;14 public:15...
阅读全文
摘要:举个书上的例子,地产中介商卖的是房子,有这样一个类:class HomeForSale{…}每个房子都是不一样的,所以希望这样:1 HomeForSale house1;2 HomeForSale house2;3 HomeForSale house3(house1); // house3企图与house1相同,不能通过这种情况4 house2 = house1; // house2也不应该与house1相同,也不能通过这种情况我们希望最后这两句话不能通过编译,那么怎样在C++中实现呢?一种想当然的做法,就是不去写拷贝构造函数和赋值运算符。但由上一个条款可以知道,这样做是行不通的,C++编译器
阅读全文
摘要:一个常见的面试题就是问“一个空类占几个字节”,想当然的是0个字节,但事实上类要区分不同的对象,比如:1 EmptyClass obj1;2 EmptyClass obj2;即便是空类,也要能识别obj1和obj2的不同,所以空类仍然要占字节数,一般占一个字节。还有一个针对空类的问题是“一个空类里面有什么”,就是想问编译器为这个空类自动生成了哪些成员函数。很容易想到的是生成了默认的构造函数和析构函数,事实上还有拷贝构造函数和赋值运算符,所以,总共生成了四个成员函数。具体地说,就是你表面上写了1 Class EmptyClass2 {3 };但实际编译器为你加了四个成员函数,所以看起来像这样: 1
阅读全文
摘要:1. 内置类型C++中的内置基本类型,比如int,double,float等,初值都是垃圾值,即声明int i,i的初值是一个垃圾值。本书建议的最佳处理方法是:永远在使用对象之前将之初始化。比如:1 int x = 0;2 3 const char* test = “hello world”;4 5 double d; cin >> d;2. STLC++提供了丰富的容器,比如vector,list,deque,map和set等,这些容器已经写好了构造函数,所以总会自动初始化成默认值,程序员可以直接使用,比如:vector<int> vt; vt.push_back(3
阅读全文
摘要:const是常量的意思,它可以定义一个不可改变的量,主要用于以下几个地方:1. 修饰变量,使之不可改变举个例子:const int var = 3;此时var的值就不能改变了。也正是因为const的变量不能轻易修改存储的值,所以在声明的时候就要初始化,这样就是不行的:const int var;编译器就会报错。2. 修饰指针指针是特殊的变量,有时我们希望对它所指向的对象操作,而有时我们又希望对指针本身进行操作。同样,const应用于指针也有两个含义:一个是指向常量(指向的内容不可更改),一个是常量指针(指针的指向不可更改)。看下面这两个例子:const int* p = &a;/* p
阅读全文
摘要:其实这个条款分成两部分介绍会比较好,第一部分是用const和enum替换不带参的宏,第二部分是用inline替换带参的宏。第一部分:用const和enum替换不带参宏宏定义#define发生在预编译期,而const,enum定义的常量发生在编译期,两者的重要差别在于编译期里的变量是进符号表的,而预编译期的宏是简单的替换,不进符号表。因此,const, enum定义的常量具有以下优势:(1)支持类型检查(2)支持访问权限第(1)条优势,其实在Visual Studio编译器也已经对宏也引入了类型检查了,但不是所有的编译器都这样;第(2)条优势是指可以把这些常量放在类中,从而避免了全局的作用域,而
阅读全文
摘要:C++起源于C,最初的名称为C with Classes,意为带类的C语言,然而,随着C++的不断发展和壮大,在很多功能上已经远远超越了C,甚至一些C++程序员反过来看C代码会觉得不习惯。C++可以看成由四个部分组成,分别是:(1) C。C++从语法和代码风格上以C为基础,这也正是C++命名的由来,是在C的基础上++。有意思的是,在《C++ Primer》这本书里有一个问题,问为什么C++叫“C++”而不叫“++C”呢?原因很简单,C++具有深厚的C的底蕴,++C也许得到的是D,象征着另一种语言,而C++返回的还是C,表明它是站在C这个巨人的肩膀之上的。(2) 面向对象。面向对象编程是C++不
阅读全文
摘要:计时函数(二)boost库中提供了更精确计时函数,这是因为其所包含了date_time库中提供了秒和微秒的时钟。下面分成两部分,第一部分介绍boost库的配置,第二部分介绍如何获得微秒级的计时。第一部分:boost库的配置从 www.boost.org 中下载boost函数库,里面有个HTML形式的帮助文档,打开index.htm或者index.html即可看到分层别类的帮助信息。阅读帮助文档是学习新知识最直接最方便的方法。date_time需要编译才能使用其完整功能(不编译其实也行,只是每次编译器都会对包含的头文件进行编译,速度相对于已经编译好的文件而言会慢一些),编译方法如下:1. 运行b
阅读全文
摘要:计时函数(一) 欢迎讨论http://www.cnblogs.com/jerry19880126/ 所谓“时”,可以分成时间点和时间段两大类,时间点的概念就好比知道现在是几时几分,而时间段主要用于计量这段程序运行了多久,或者用于定时触发中断。C/C++中有多种方法可以实现计时。 1. 用time()
阅读全文
摘要:布局与风格愿我的读书笔记带你翻过45页的书 http://www.cnblogs.com/jerry19880126/布局主要是代码的书写方式,也包括注释,简单来说,就是你的源文件的样式。“恐怖”的代码布局会让你不想再多看一眼代码,比如:但是好的布局会让你有更集中的精力对付代码中的逻辑,而不是去分层断句,比如下面的代码布局就好多了:我觉得书上有一段引用很好,“傻子都会写让计算机理解的代码;而优秀的程序员写的是人能看懂的代码”。优秀的程序员写出的代码会有良好的布局,因为好的源码布局有助于:(1) 准确表现代码的逻辑结构(2) 始终如一地表现代码的逻辑结构(3) 改善可读性(4) 经得起修改下面着
阅读全文
摘要:控制循环愿我的读书笔记能带你翻过20页的书http://www.cnblogs.com/jerry19880126/首先复习一下循环的种类,主要分成for循环与while循环。其中for循环在已知执行次数时使用,比如for(int i = 0; i < 10; ++i)就是指针循环10次;while循环多用于执行次数未知的场合,往往要添加一定的条件,比如while(条件){…},当条件满足时会执行循环体内的代码,执行完一次后,再去判断条件是否满足,依此规律执行下去。while还有do…while的变式,即do{…}while(条件),这种情况下循环体是至少执行一次的。但在实际编程中,更常
阅读全文
摘要:组织直线型代码 + 使用条件语句希望我的读书笔试能带你翻过18页的书http://www.cnblogs.com/jerry19880126/《代码大全》第14章和第15章的内容比较少,这里就写在一起了。首先看第14章——组织直线型代码,本章主要讲了两个知识点。第一个知识点是怎样书写出有明确顺序的代码,以书上的例子来说:1 data = ReadData();2 results = CalculateResultsFromData(data);3 PrintResults(results);这三行代码具有鲜明的时间顺序,即前一条语句的输出是后一条语句的输入。但如果是这样的代码:1 Comput
阅读全文
摘要:使用变量的一般事项注:希望我的读书笔记能带你翻过20页的书http://www.cnblogs.com/jerry19880126/本章主要讨论变量的一些使用事项,看似非常基础,但你是否真有“好的使用习惯”?不妨来看看。1. 在声明变量的时候就应该初始化这告诉我们应该把int count换成int count = 0,把short *pointer换成short *pointer = 0。有些语言,比如VB不支持声明的时候就初始化,那就在变量声明的下一句就给赶紧给它赋个值吧!当变量是对象时,则要确保这个对象被合理地初始化了,在类中要定义构造函数(最好有个默认的构造函数)。2. 能使用const
阅读全文
摘要:不常见的数据类型前注:希望我的读书笔记能带你迅速走过25页的书籍,有不妥之处,欢迎指正。http://www.cnblogs.com/jerry19880126/本章主要介绍三种“不常见”的数据类型,分别是结构体,指针和全局数据,其实我觉得这三种数据类型还是很常见的,不太认同本书将之分类成“不常见”。第一部分:结构体结构体好比是一个团体,它将一些相关的数据放在一起,比如对于student而言,属性可能包括name,age,sex,height和weight等,因此可以这样声明一个学生的结构体:struct Student{ string name; int age; char sex; int
阅读全文
摘要:关键的“构建”决策前注:这一章比较简单,我只能带你翻过10页书http://www.cnblogs.com/jerry19880126/这章内容概要只要一句话就能总结了,那就是选择适当的编程语言并设定一致的规则去做项目,要“深入一种语言编程”,而不要仅在“一种语言上编程”。这章内容就这一句话也就够了,但我还想说说别的。在我的身边有不少同学都是熟知C语言,这对付嵌入式来说绰绰有余,但是现在互联网却更多的要求面向对象技术,所以学习C++或Java是有益的,特别是对于找工作而言。如果你只会C而对C++知之甚少的话,无疑会失去很多的应聘机会。比如今年(2012)趋势科技的笔试题就是在C++和Java中
阅读全文