C++
文章平均质量分 62
冬之晓东
国家对地观测科学数据中心信息发布
展开
-
C++的顶层const和底层const的理解
最近,又一次翻开C++primer,决定仔细研究一下自己以前没搞懂的顶层const和底层const,这次看了后感觉明白了,所以记录下来,以后可以没事翻阅,增加记忆。首先,const是一个限定符,被它修饰的变量的值不能改变。对于一般的变量来说,其实没有顶层const和底层const的区别,而只有向指针这类复合类型的基本变量,才有这样的区别。 一 如何区分顶层const和底层const指针如果添加co...原创 2016-03-18 12:40:43 · 37591 阅读 · 36 评论 -
《Effect C++》学习------条款19:设计class犹如设计type
在 C++ 中,就像其它面向对象编程语言,可以通过定义一个新的类来定义一个新的类型。作为一个C++开发者,你的大量时间就这样花费在扩张你的类型系统。这意味着你不仅仅是一个类的设计者,而且是一个类型的设计者。重载函数和运算符,控制内存分配和回收,定义对象的初始化和终结过程——这些全在你的掌控之中。因此你应该在类设计中倾注大量心血,就如语言设计者在语言内置类型设计中所倾注的大量心血。设计良好的类是有挑战原创 2016-09-18 19:36:53 · 365 阅读 · 0 评论 -
《Effect C++》学习------条款20 :宁以pass-by-reference-to-const替换pass-by-value
缺省的情况下,C++是以by value方式传递对象至函数。函数实参都是以实际实参的复件为初始值,而调用端获得的亦是函数返回值的一个复件。这些复件系由对象的copy构造函数产出,这可能使得pass by value成为昂贵的操作。考虑下面的继承体系:classPerson{public: Person(); vitual~Person();private: std::stringn原创 2016-09-19 21:40:41 · 376 阅读 · 0 评论 -
《Effect C++》学习------条款21:当必须返回对象时,别妄想返回其reference
当你理解条款20后,很可能出现一种过度使用的情况:只要看到是一个非内置类型,就去使用引用传值。例如:class Rational{public: Rational(intnumerator=0,int denominator=1); //条款24解释此函数为什么不声明为explicitprivate: int n,d; //分子numerator和分母denom原创 2016-09-19 21:47:08 · 349 阅读 · 0 评论 -
《Effect C++》学习------条款22:将成员变量声明为private
为什么不采用public成员变量首先,语法一致性考虑,客户唯一能访问对象的方法就是通过成员函数,客户不必考虑是否该记住使用小括号()。其次,使用函数可以让你对成员变量的处理有更精确的控制。如果成员变量是public,每个人都可以读写它,但是如果你也函数。取得或设定其值,你就可以实现“不准访问”、“只读访问”,以及”读写访问”甚至”唯写访问“:class AccessLevels { public原创 2016-09-19 21:54:06 · 299 阅读 · 0 评论 -
《Effect C++》学习------条款23 :宁以non-member、non-friend替换member函数
本条款还是讨论封装的问题,举书上的例子:class WebBrower{public: void ClearCach(); void ClearHistory(); void RemoveCookies();};定义了一个WebBrower的类,里面执行对浏览器的清理工作,包括清空缓存,清除历史记录和清除Cookies,现在需要将这三个函数打包成一个函数,这个函数执行所原创 2016-09-19 21:56:15 · 395 阅读 · 0 评论 -
《Effect C++》学习------条款08:别让异常逃离析构函数
由于C++并不禁止析构函数吐出异常,但它并不鼓励你这么做,所以,当我们不小心写出了问题代码的时候。考虑下面的代码:class Widget{public:~Widget(){...} //假设这个可能吐出一个异常};void dosomething(){vector<Widget> v;} //v在这里被自动销毁当vector被销毁,它有责任销毁其内含的所有Widgets。假设v内含原创 2016-09-07 21:48:49 · 300 阅读 · 0 评论 -
《Effect C++》学习------条款09:绝不在构造和析构过程中调用virtual函数
不该在构造函数和析构函数期间调用virtual函数,这一点是C++与jave/C#不同的地方之一。假设有一个class继承体系,用来模拟股市交易如买进、卖出的订单等等。这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志中也需要创建一笔适当记录。下面是颇为合理的做法:class Transaction // 交易的基类{pub原创 2016-09-07 21:49:53 · 359 阅读 · 0 评论 -
《Effect C++》学习------条款10:令 operator= 返回一个 reference to *this
关于赋值,有趣的是你可以把它们写成连锁形式:int x, y, z;x = y = z = 15; 同样有趣的是,赋值采用右结合律,所以上述连锁赋值被解析为:x = (y = (z = 15));这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参。这是你为class原创 2016-09-07 21:50:30 · 279 阅读 · 0 评论 -
《Effect C++》学习------条款24 :若所有参数皆须类型转换,请为此采用non-member函数
首先还是下面这个classclass Rational{public: Rational(int numirator = 0, int denominator = 1); int numurator() const; int denominator() const; // getter;};想要支持operator*的时候我们首先可能想到原创 2016-09-25 19:10:31 · 372 阅读 · 0 评论 -
《Effect C++》学习------条款25:考虑写出一个不抛出异常的swap函数
swap是STL中的标准函数,用于交换两个对象的数值。后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制。swap的实现如下:template<class T>void swap(T& a, T& b){ T c = a; a = b; b = c;}只要T支持copying函原创 2016-09-25 19:11:14 · 324 阅读 · 0 评论 -
《Effect C++》学习------条款26:尽可能延后变量定义式的出现时间
定义一个类变量,当程序的控制流到达这个变量定义时,你就必须承担起构造和析构的负担,所以我们要尽量减少定义一些我们不用的对象。string encryptPassword(const std::string& password) { using namespace std; string encrypted; if(password.length() < MinimumPass原创 2016-09-25 19:12:37 · 507 阅读 · 0 评论 -
《Effect C++》学习------条款27:尽量少做转型动作
首先是C++提供的四种转型操作:const_cast:常量性的转除。dynamic_cast:安全的向derived class进行转型,可能会带来很高的开销reinterpret_cast:低级转型,例如可讲pointer转成int,不建议使用static_cast: 强迫隐式转换,例如int to const int,int to double, 但是const int 到 int 只有原创 2016-09-25 19:13:30 · 364 阅读 · 0 评论 -
《Effect C++》学习------条款28:避免返回handles指向对象内部成分
首先是一个矩形的例子:class Point{public: point(int x, int y); ... void setX(int newVal); void setY(int newVal); ...};struct RectData{ Point ulhc; //左上角 Point lrhc; //右下角};class R原创 2016-09-25 19:14:31 · 430 阅读 · 0 评论 -
《Effect C++》学习------条款29:为“异常安全”而努力是值得的
先举书上的例子:void PrettyMenu::changeBackground(std::istream& imgSrc){ lock(&mutex); delete bgImage; ++ imageChanges; bgImage = new Image(imgSrc); unlock(&mutex);}这段代码大致的意思就是改变背景图片,删掉旧的原创 2016-10-02 22:09:36 · 855 阅读 · 0 评论 -
Linux下C++编程(一)----Linux基础学习
Linux基础学习原创 2017-07-27 12:57:42 · 757 阅读 · 0 评论 -
《Effect C++》学习------条款18:让接口容易被正确使用,不容易被误用
程序员设计接口时应本的对用户负责的态度,“如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不应该通过编译;如果代码通过了编译,那它的作为就该是客户所想要的”。假如设计的是一个日期类:class Date{public: Date(int month, int day, int year); …};这个类看上去好像没有问题,提供的构造函数接口简单直观,然而它却做了一个原创 2016-09-18 19:35:51 · 390 阅读 · 0 评论 -
《Effect C++》学习------条款17:以独立语句将Newed对象放置入智能指针
假设我们有一个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理:int priority();void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);不要忘记使用对象管理资源的至理名言,processWidget为处理动态分配的 Widget使用了一个智能指针(在此采用t原创 2016-09-18 19:35:11 · 383 阅读 · 0 评论 -
《Effect C++》学习------条款16:成对使用new和delete时要采取相同形式
当使用new时(即通过new动态生成一个对象),有两件事发生:第一,内存被分配出来(通过名为operator new 的函数);第二,针对此内存会有一个(或更多)构造函数被调用。当使用delete时,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放(通过名为operator delete 的函数)。delete的最大问题在于:即将被删除的内存之内有究竟存有多少对象?(即将原创 2016-09-18 19:30:44 · 375 阅读 · 0 评论 -
sizeof和strlen的一些理解
最近又一次看到sizeof运算符和strlen函数,感觉有点忘了,就打开《C++primer》研究一下,这里做下记录,以后忘记可以随时查看,比较方便。1 sizeof的定义首先,sizeof运算符返回一条表达式或一个类型名字所占用的字节数。sizeof运算符满足右结合律,其所得的值是一个size_t类型。size_t类型是一种机器相关的无符号类型,它设计的足够大以便能够表示内存中任意对象的原创 2016-04-17 08:12:19 · 412 阅读 · 0 评论 -
模板类中重载<<和>>操作符
今天复习一下如何重载操作符,就编了如下程序:搜了一下,发现那么输入输出流重载为什么不能在类内声明,类外实现呢??因为模板比较特殊,我们知道操作符重载函数不是类的成员函数,因此此处相当于定义了一个新的函数模板(不同于类中的friend ostream& operator& t) )。但若去掉template ,函数中的参数Test就不知是什么类型,所以不能在模板类内声明,类外实现操作原创 2016-06-04 18:37:08 · 4355 阅读 · 1 评论 -
《Effect C++》学习------条款07:为多态基类声明virtual析构函数
条款07:为多态基类声明virtual析构函数有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes作为不同的计时方法,相当合情合理:class TimeKeeper{public: TimeKeeper(); ~TimeKeeper(); class AtomicClock: public TimeKeeper{.原创 2016-08-16 12:40:54 · 381 阅读 · 0 评论 -
《Effect C++》学习------基本知识
术语我觉得C++里面比较重要的基础就是一些术语。 - 首先较为重要的术语就是声明式,它是用来告诉编译器某个东西的名称和类型,但略去细节。如下面几个例子:extern int x; //对象声明式std::size_t numDigits(int number); //函数声明式class Widget; //类声明式//下面的一个声明式我也不熟,从没用过!template<ty原创 2016-08-10 10:55:03 · 3826 阅读 · 0 评论 -
《Effect C++》学习------条款1 视C++为一个语言联邦
条款1 视C++为一个语言联邦C++是一个多重泛型编程语言同时支持:面向过程形式、面向对象形式、函数形式、泛型形式、元编程形式。 为了理解C++,你必须认识主要的四个次语言:C。.区块(blocks),语句(statements),预处理器(proprocessor),内置数据类型(built-in data types),数组(arrays),指针(pointers)等统统来自C,许多C++对原创 2016-08-10 10:57:23 · 1609 阅读 · 0 评论 -
《Effect C++》学习------条款11:在 operator= 中处理“自我赋值”
“自我赋值”发生在对象被赋值给自己时:class Widget{ ...};Widget w;...w = w; //赋值给自己自我赋值,看起来愚蠢,但是却合法。所有不用认定客户不会这么做。此外赋值动作并不总是那么可被一眼辨别出来,例如:a[i]= a[j]; //潜在的自我赋值如果i和j有相同的值,这便是自我赋值。再看:*px = *py; //潜在的自我赋值如果px和p原创 2016-09-12 15:14:03 · 352 阅读 · 0 评论 -
《Effect C++》学习------条款02:尽量以const,enum,inline替换#define
尽量以const, enum, inline替换#define的意思是: 宁可以编译器替换预处理器。 为什么要用const代替宏? 原因太多, 我不一一列举。 看程序:为啥用const代替宏呢?#include <iostream>using namespace std;#define PI 3.14int main(){ cout << PI << endl; return原创 2016-08-11 13:12:51 · 457 阅读 · 0 评论 -
《Effect C++》学习------条款03:尽可能使用const
条款03:尽可能使用constconst的一件奇妙的事情是,它允许你指定一个语义约束,而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某个数值应该保持不变。只要这(某值保持不变)是事实,你就确实该说出来,因为说出来可以获得编译器的相助,确保这条约束不被违反。对于指针来说:如果关键字const出现在星号左边,表示被指物为常量,如果出现在星号右边,表示指针自身为常量,如果出现在星号两边,表示原创 2016-08-14 08:50:29 · 425 阅读 · 0 评论 -
《Effect C++》学习------条款04:确定对象被使用前以先被初始化
为内置型对象进行手工初始化,因为C++不保证初始化它们。 对于内置类型以外的其它类型,初始化责任落在构造函数,确保每一个构造函数都将对象的每一个成员初始化。C++中的内置基本类型,比如int,double,float等,初值都是垃圾值,即声明int i,i的初值是一个垃圾值。本书建议的最佳处理方法是:永远在使用对象之前将之初始化。 - STL C++提供了丰富的容器,比如vecto原创 2016-08-14 14:51:22 · 406 阅读 · 0 评论 -
《Effect C++》学习------条款05:了解C++默默编写并调用哪些函数
条款05:了解C++默默编写并调用哪些函数c++的编译器是非常智能的!当你声明一个空类empty class,如果你的代码有用到这个empty class时,编译器会默默的为你编写一些基本的函数。 那么究竟编译器自己添加的函数都有哪些呢?构造函数,析构函数,一个copy构造函数和一个copy assignment操作符。举个例子来说明一下,如果你写下:class empty{};就好像你写下这样的原创 2016-08-14 14:52:17 · 482 阅读 · 0 评论 -
《Effect C++》学习------条款06:若不想使用编译器自动生成的函数,就该明确拒绝
举个例子:地产中介商卖的是房子,有这样一个类:class HomeForSale {…} 每个房子都是不一样的,所以希望这样:HomeForSale house1;HomeForSale house2;HomeForSale house3(house1); // house3企图与house1相同,不能通过这种情况house2 = house1; // house2也不应该与house1相原创 2016-08-14 14:52:45 · 337 阅读 · 0 评论 -
《Effect C++》学习------条款12:复制对象时勿忘其每一个成分
设计良好的面向对象系统会将对象的内部封装起来,只留两个函数负责对象拷贝,即copy构造函数与copy assignment操作符。编译器会在必要的时候为类创建coping函数,并说明这些“编译器生成版”的行为:将被拷贝对象的所有成员变量都做一份拷贝。class Date {...}; class Customer { public: ... private: st原创 2016-09-18 16:38:03 · 360 阅读 · 0 评论 -
《Effect C++》学习------条款13:以对象管理资源
我们都知道,当new一个东西之后,必须delete它。但是问题可能出现在在new和delete之间:比如中间出现了异常,或者return之类的。一种比较好的作法是通过对象来管理:因为当对象的声明周期结束以后,会调用析构函数,而在析构函数中delete,这样的作法就靠谱多了。假设类Investment是各种关于投资的基类,股票类Stock继承自Investment。有一个工厂函数可以返回一个具体的In原创 2016-09-18 16:39:08 · 352 阅读 · 0 评论 -
《Effect C++》学习------条款14:在资源管理类中小心coping行为
在前一个条款,我们提出了RAII(资源获得即是初始化)技术,通过“对象管理资源”达到防止资源泄露,对于通过堆分配的内存,可以借助指针指针实现,但系统中有很多资源不是堆分配:文件句柄,锁,网络套接字。这些资源就需要自己实现对象来管理。 看一个简单的实现互斥锁资源对象管理:class Mutex{};void lock(Mutex* mutex) {} //锁住资源void unlock(Mut原创 2016-09-18 16:40:04 · 383 阅读 · 0 评论 -
《Effect C++》学习------条款15:在资源管理中提供对原始资源的访问
下面代码:tr1::shared_ptr<Investment> pInv(createInvestment()); int daysHeld(const Investment* pi); 我们要调用daysHeld函数的话,就必须传递一个Investment指针,但是我们现在只有pInv对象,所以我们需要一个函数可将RAII class(本例为tr1::shared_ptr)对象转换为其所内原创 2016-09-18 16:41:02 · 345 阅读 · 0 评论 -
Linux下C++编程(二)----vim简单使用
Vim使用原创 2017-07-28 09:31:07 · 1140 阅读 · 0 评论