青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 9, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

2013年5月17日

  • Make sure operator= is well-behaved when an object is assigned to itself. Techniques include comparing addresses of source and target objects, careful statement ordering, and copy-and-swap.

  • Make sure that any function operating on more than one object behaves correctly if two or more of the objects are the same.

posted @ 2013-05-17 15:00 魏尚堂 閱讀(164) | 評論 (0)編輯 收藏

This is only a convention; code that doesn't follow it will compile. However, the convention is followed by all the built-in types as well as by all the types in  the standard library (e.g., string, vector, complex, tr1::shared_ptr, etc.). Unless you have a good reason for doing things differently, don't.

posted @ 2013-05-17 12:06 魏尚堂 閱讀(168) | 評論 (0)編輯 收藏

base class constructors execute before derived class constructors, derived class data members have not been initialized when base class constructors run. If virtual functions called during base class construction went down to derived classes, the derived class functions would almost certainly refer to local data members, but those data members would not yet have been initialized.Calling down to parts of an object that have not yet been initialized is inherently dangerous, so C++ gives you no way to do it.

#include <iostream>
#include <string>
#include <cstdlib>
void print(std::string str){std::cout << str<< std::endl;}
class Transaction {
    public:
        Transaction()
        {
            print("Transaction Constructor");
            logTransaction();
        }
        virtual void logTransaction() const // =0;
        {
            print("Transaction Log");
        }
};
class BuyTransaction: public Transaction
{
    public:
        BuyTransaction(){   print("BuyTransaction Constructor");}
        virtual void logTransaction() const
        {
            print("BuyTransaction Log");
        }
};
int main()
{
    BuyTransaction dbc;
    //dbc.logTransaction();
}
pure virtual functions cannot link.
[shangtang@BTSOM-1 study]$ g++ TestT.cpp
TestT.cpp: In constructor 'Transaction::Transaction()':
TestT.cpp:14: warning: abstract virtual 'virtual void Transaction::logTransaction() const' called from constructor
/tmp/ccXFzaHv.o: In function `Transaction::Transaction()':
TestT.cpp:(.text._ZN11TransactionC2Ev[Transaction::Transaction()]+0x7f): undefined reference to `Transaction::logTransaction() const'
collect2: ld returned 1 exit status
virtual function can compile, run, but with surprise result
[shangtang@BTSOM-1 study]$ ./a.out
Transaction Constructor
Transaction Log
BuyTransaction Constructor

The only way to avoid this problem is to make sure that none of your constructors or destructors call virtual functions on the object being created or destroyed and that all the functions they call obey the same constraint.

posted @ 2013-05-17 11:27 魏尚堂 閱讀(237) | 評論 (0)編輯 收藏

Depending on the precise conditions under which such pairs of simultaneously active exceptions arise, program execution either terminates or yields undefined behavior. In this example, it yields undefined behavior.
C++ does not like destructors that emit exceptions!
#include <iostream>
#include <vector>
struct Exception
{
    Exception(){std::cout << "Exception Constructor" << std::endl;}
    ~Exception(){std::cout << "Exception Destructor" << std::endl;}
};
class Widget {
public:
  ~Widget() {std::cout << "Widget Destructor" << std::endl; throw Exception();
  }        //this might emit an exception
  void print(){std::cout << "print" << std::endl;}
};
                
void doSomething();
int main()
{
    doSomething();
}
void doSomething()
{
  std::vector<Widget> v;
  v.push_back(Widget());
  v.push_back(Widget());
  v.push_back(Widget());
  v.push_back(Widget());
  std::vector<Widget>::iterator it = v.begin();
  while(it != v.end())
  {
    std::cout << "end" << std::endl;
    (*it).print();
    it++;
  }
}
complie with g++
[shangtang@BTSOM-1 study]$ ./a.out
Widget Destructor
Exception Constructor
terminate called after throwing an instance of 'Exception'
Aborted (core dumped)
There are two primary ways to avoid the trouble.

   1, Terminate the program if catch a exception, typically by calling std::abort (cstdlib)
  2, 
Swallow the exception if catch a exception, print a log

posted @ 2013-05-17 10:56 魏尚堂 閱讀(167) | 評論 (0)編輯 收藏

2013年5月13日

1, Declare destructors virtual in polymorphic base classes
why ? because C++ specifies that when a derived class object is deleted through a pointer to a base class with a non-virtual destructor, results are undefined.What typically happens at runtime is that the derived part of the object is never destroyed

2, if a class is not intended to be a base class, making the destructor virtual is usually a bad idea. 
why?  if a class have virtual functions, it has extra overhead(vptr).

3, In fact, many people summarize the situation this way: declare a virtual destructor in a class if and only if that class contains at least one virtual function

4,Sometimes, however, you have a class that you'd like to be abstract, but you don't have any pure virtual functions.
solution: declare pure virtual destructor.
There is one twist, however you must provide a definition for the pure virtual destructor, or linker will complain.

5, Not all base classes are designed to be used polymorphically. Neither the standard string type, for example, nor the STL container typesare designed to be base classes at all, much less polymorphic ones.


 
 

posted @ 2013-05-13 14:45 魏尚堂 閱讀(240) | 評論 (0)編輯 收藏

2013年1月24日

thinking in c++ 有下面的例子,不太理解為什么這個宏中的條件表達式在編譯時就執行了,在此作個記號

// A simple, compile-time assertion facility
#define STATIC_ASSERT(x) \
   do { typedef int a[(x) ? 1 : -1]; } while(0)

int main()
{
   STATIC_ASSERT(sizeof(int) <= sizeof(long));  // Passes
   STATIC_ASSERT(sizeof(double) <= sizeof(int)); // Fails 
   return 0;
}

posted @ 2013-01-24 10:26 魏尚堂 閱讀(690) | 評論 (0)編輯 收藏

2013年1月21日

template <typename T> class dataList
{
   public:
      friend ostream& operator<<(ostream& outStream, const dataList <T> &outList);
}
template <typename T> ostream& operator<<(ostream& outStream, const dataList <T> &outList)
{
   //....
   return outStream;
}
int main(int argc, char* argv[])
{
   dataList <int> testList;
   cout << testList;
}
這個程序員是鏈接不過,
錯誤信息:
 warning: friend declaration âstd::ostream& operator<<(std::ostream&, const dataList<T>&)â declares a non-template function
 note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
/tmp/cc9DSuka.o: In function `main':
undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, dataList<int> const&)'
collect2: ld returned 1 exit status
錯誤原因解釋

The problem is that the compiler is not trying to use the templated operator<< you provided, but rather a non-templated version.

When you declare a friend inside a class you are injecting the declaration of that function in the enclosing scope. The following code has the effect of declaring (and not defining) a free function that takes a non_template_test argument by constant reference:

class non_template_test { friend void f( non_template_test const & ); }; // declares here: // void f( non_template_test const & );

The same happens with template classes, even if in this case it is a little less intuitive. When you declare (and not define) a friend function within the template class body, you are declaring a free function with that exact arguments. Note that you are declaring a function, not a template function:

template<typename T> class template_test { friend void f( template_test<T> const & t ); }; // for each instantiating type T (int, double...) declares: // void f( template_test<int> const & ); // void f( template_test<double> const & );  int main() {     template_test<int> t1;     template_test<double> t2; }

Those free functions are declared but not defined. The tricky part here is that those free functions are not a template, but regular free functions being declared. When you add the template function into the mix you get:

template<typename T> class template_test { friend void f( template_test<T> const & ); }; // when instantiated with int, implicitly declares: // void f( template_test<int> const & );  template <typename T> void f( template_test<T> const & x ) {} // 1  int main() {    template_test<int> t1;    f( t1 ); }

When the compiler hits the main function it instantiates the template template_test with type intand that declares the free function void f( template_test<int> const & ) that is not templated. When it finds the call f( t1 ) there are two f symbols that match: the non-template f( template_test<int> const & ) declared (and not defined) when template_test was instantiated and the templated version that is both declared and defined at 1. The non-templated version takes precedence and the compiler matches it.

When the linker tries to resolve the non-templated version of f it cannot find the symbol and it thus fails.

What can we do? There are two different solutions. In the first case we make the compiler provide non-templated functions for each instantiating type. In the second case we declare the templated version as a friend. They are subtly different, but in most cases equivalent.

Having the compiler generate the non-templated functions for us:

template <typename T> class test  { friend void f( test<T> const & ) {} }; // implicitly

This has the effect of creating as many non-templated free functions as needed. When the compiler finds the friend declaration within the template test it not only finds the declaration but also the implementation and adds both to the enclosing scope.

Making the templated version a friend

To make the template a friend we must have it already declared and tell the compiler that the friend we want is actually a template and not a non-templated free function:

template <typename T> class test; // forward declare the template class template <typename T> void f( test<T> const& ); // forward declare the template template <typename T> class test { friend void f<>( test<T> const& ); // declare f<T>( test<T> const &) a friend }; template <typename T> void f( test<T> const & ) {}

In this case, prior to declaring f as a template we must forward declare the template. To declare the ftemplate we must first forward declare the test template. The friend declaration is modified to include the angle brackets that identify that the element we are making a friend is actually a template and not a free function.
引用自 http://stackoverflow.com/questions/1810753/overloading-operator-for-a-templated-class
從上面我可以學到一點:
1, 編譯器匹配方法時非模板函數優先模板函數
2, 友元函數模板必須提前聲明

posted @ 2013-01-21 10:48 魏尚堂 閱讀(615) | 評論 (0)編輯 收藏

2013年1月17日

Linux Shell的通配符與正則表達式 http://blog.csdn.net/chen_dx/article/details/2463495

posted @ 2013-01-17 14:01 魏尚堂 閱讀(168) | 評論 (0)編輯 收藏

2012年11月27日

Perform every resource allocation (e.g., new) in its own code statement which immediately gives the new resource to a manager object (e.g., auto_ptr).

This guideline is easy to understand and remember, it neatly avoids all of the exception safety problems in the original problem, and by mandating the use of manager objects it helps to avoid many other exception safety problems as well. This guideline is a good candidate for inclusion in your team's coding standards

link http://www.gotw.ca/gotw/056.htm

file I/O http://www.zwqxin.com/archives/cpp/use-sstream.html

posted @ 2012-11-27 10:03 魏尚堂 閱讀(158) | 評論 (0)編輯 收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            裸体歌舞表演一区二区| 欧美深夜影院| 亚洲国内在线| 亚洲第一黄色| 欧美精品自拍| 亚洲影院免费观看| 午夜老司机精品| 激情一区二区三区| 亚洲电影视频在线| 欧美视频一区二区三区四区| 午夜精品理论片| 久久久久亚洲综合| 亚洲老司机av| 亚洲一区在线免费| 在线观看av不卡| 亚洲精品久久久久久久久| 国产精品久久久久久久久久ktv| 欧美一区二区三区在线看| 久久在线免费观看| 一本久久综合亚洲鲁鲁五月天| 亚洲永久精品国产| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲欧洲一二三| 国产日产精品一区二区三区四区的观看方式 | 猛干欧美女孩| 欧美日韩综合视频| 麻豆精品视频在线| 欧美三级午夜理伦三级中文幕 | 午夜在线精品偷拍| 国产欧美在线播放| 亚洲激情av| 国产手机视频精品| 亚洲精品国产精品久久清纯直播| 国产欧美日韩一区二区三区在线观看 | 久久久国产视频91| 欧美日韩国产系列| 免费看成人av| 国产麻豆视频精品| 99精品免费视频| 亚洲国产精品成人一区二区| 亚洲午夜久久久久久久久电影网| 在线观看福利一区| 先锋影音国产精品| 亚洲欧美国产精品va在线观看| 免费视频一区二区三区在线观看| 欧美一区二区三区免费观看视频 | 欧美sm极限捆绑bd| 久久久久久亚洲精品中文字幕| 欧美日韩在线不卡一区| 亚洲第一页在线| 精品不卡在线| 久久爱www久久做| 欧美在线一级va免费观看| 欧美午夜精品一区| 亚洲精品综合久久中文字幕| 亚洲激情成人| 噜噜噜躁狠狠躁狠狠精品视频| 久久视频国产精品免费视频在线| 国产精品ⅴa在线观看h| 亚洲美女黄网| 日韩一级免费| 欧美日本精品一区二区三区| 亚洲激情电影在线| 亚洲三级观看| 欧美精品电影| 亚洲欧洲日本mm| 夜夜嗨av一区二区三区中文字幕 | 午夜免费日韩视频| 午夜一区不卡| 国产日韩欧美综合精品| 欧美在线91| 你懂的视频一区二区| 亚洲丰满在线| 欧美福利视频在线| 亚洲麻豆视频| 欧美亚洲午夜视频在线观看| 国产精品永久免费| 久久国产精品亚洲77777| 久久人人看视频| 亚洲国产mv| 欧美日韩视频不卡| 亚洲手机视频| 久久久噜噜噜久久久| 亚洲国产精品久久久久秋霞蜜臀| 免费日韩视频| 在线亚洲欧美| 久久久久久欧美| 亚洲欧洲综合| 国产精品九九久久久久久久| 午夜日韩在线观看| 欧美顶级少妇做爰| 中日韩午夜理伦电影免费| 国产噜噜噜噜噜久久久久久久久| 久久精品人人爽| 亚洲精品一区二区三区av| 亚洲免费一在线| 伊人精品成人久久综合软件| 欧美精品一区在线观看| 亚洲永久在线| 亚洲第一区在线观看| 亚洲欧美乱综合| 亚洲国产成人在线| 国产精品成人免费视频| 久久亚洲国产精品日日av夜夜| 亚洲精品资源美女情侣酒店| 久久久免费av| 亚洲视频综合| 亚洲激情专区| 国产亚洲高清视频| 欧美日韩一区二区在线观看 | 99在线热播精品免费| 久久综合九色综合欧美狠狠| 亚洲视频图片小说| 亚洲第一视频| 国产人成精品一区二区三| 欧美久久影院| 噜噜噜91成人网| 欧美一区二区三区的| 亚洲免费精彩视频| 欧美激情一区在线观看| 久久精品99| 欧美一区二区久久久| 中文欧美日韩| 亚洲精品久久久蜜桃| 在线观看91久久久久久| 国产欧美精品| 国产精品h在线观看| 欧美激情综合亚洲一二区| 久久综合九色| 久久久久久九九九九| 欧美一区二区三区在线| 亚洲婷婷在线| 亚洲一区二区免费| 99精品99久久久久久宅男| 亚洲激情网址| 亚洲人成网站999久久久综合| 欧美成人免费播放| 你懂的一区二区| 免费一级欧美在线大片| 久久看片网站| 久久婷婷影院| 另类春色校园亚洲| 欧美成人国产va精品日本一级| 久久精品免费电影| 欧美一区二区成人6969| 欧美在线视频免费播放| 午夜精品亚洲| 欧美中文字幕不卡| 久久九九国产精品怡红院| 久久国产精彩视频| 久久精品网址| 毛片av中文字幕一区二区| 乱中年女人伦av一区二区| 老司机一区二区三区| 欧美不卡在线视频| 亚洲激情自拍| 一本大道久久精品懂色aⅴ| 亚洲一区二区3| 久久er99精品| 欧美1区2区视频| 欧美日韩亚洲另类| 国产欧美欧美| 在线观看国产一区二区| 日韩性生活视频| 午夜精品免费视频| 快播亚洲色图| 亚洲欧洲午夜| 亚洲女与黑人做爰| 久久久精品免费视频| 欧美大胆a视频| 欧美四级剧情无删版影片| 国产精品日韩在线一区| 狠狠色狠狠色综合系列| 91久久精品网| 欧美一区二区观看视频| 另类综合日韩欧美亚洲| 最新精品在线| 亚洲欧美日韩国产中文| 免费h精品视频在线播放| 欧美日韩一区在线| 激情亚洲成人| 亚洲免费人成在线视频观看| 久久伊人一区二区| 在线视频欧美日韩精品| 久久人人97超碰人人澡爱香蕉| 欧美人与禽性xxxxx杂性| 国产午夜精品全部视频播放| 日韩亚洲欧美成人| 久久资源在线| 亚洲午夜在线| 欧美激情一区二区三区全黄| 国产偷国产偷亚洲高清97cao| 亚洲人体影院| 久久久久久久91| 夜夜精品视频一区二区| 欧美成人69av| 影音先锋国产精品| 欧美一级久久| 一本久道久久久| 欧美日韩国产精品一区二区亚洲|