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

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

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 魏尚堂 閱讀(156) | 評論 (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 魏尚堂 閱讀(157) | 評論 (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 魏尚堂 閱讀(221) | 評論 (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 魏尚堂 閱讀(158) | 評論 (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 魏尚堂 閱讀(230) | 評論 (0)編輯 收藏

2013年1月24日

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

// 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 魏尚堂 閱讀(681) | 評論 (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, 編譯器匹配方法時非模板函數(shù)優(yōu)先模板函數(shù)
2, 友元函數(shù)模板必須提前聲明

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

2013年1月17日

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

posted @ 2013-01-17 14:01 魏尚堂 閱讀(162) | 評論 (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 魏尚堂 閱讀(150) | 評論 (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>
            国产精品美女久久| 亚洲视频一区在线观看| 久久久亚洲综合| 亚洲一区二区三区四区中文| 99视频精品在线| 亚洲国产另类精品专区| 久久男人av资源网站| 亚洲欧美亚洲| 亚洲欧美日韩精品久久亚洲区| 亚洲精品在线视频| 亚洲美女av在线播放| 亚洲一区久久久| 久久婷婷国产麻豆91天堂| 欧美成人激情在线| 国产精品国产三级国产普通话三级 | 亚洲精品精选| 性欧美长视频| 亚洲国产精品一区二区第一页 | 欧美在线播放视频| 久久综合狠狠综合久久激情| 欧美日韩免费高清| 国模吧视频一区| 99国产欧美久久久精品| 欧美在线一区二区| 亚洲青色在线| 久久精品系列| 国产精品久久久对白| 在线观看国产成人av片| 在线亚洲免费| 欧美激情精品久久久久久免费印度| 亚洲高清影视| 久久国产加勒比精品无码| 欧美成人免费网| 国产精品对白刺激久久久| 狠狠v欧美v日韩v亚洲ⅴ| 日韩亚洲欧美一区| 久久躁狠狠躁夜夜爽| 亚洲国产一区二区三区高清| 亚洲免费影视第一页| 欧美激情中文不卡| 国产一区999| 一本一本久久a久久精品综合妖精| 欧美在线综合视频| 亚洲国产精品va在线看黑人动漫| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久亚洲综合网| 国产精品久久久久久久7电影 | 99国产精品久久久久老师| 久久精品在线播放| 亚洲一区二区毛片| 欧美精品在线观看一区二区| 中文网丁香综合网| 久久精品三级| 午夜一区在线| 欧美一区二区在线播放| 久久综合色播五月| 亚洲高清免费在线| 午夜精品短视频| 在线亚洲一区| 欧美视频第二页| 中文欧美字幕免费| 亚洲福利精品| 久久综合99re88久久爱| 狠狠色狠狠色综合日日tαg| 久久噜噜亚洲综合| 午夜精品久久久久| 国产丝袜美腿一区二区三区| 欧美中文字幕视频在线观看| 99精品热视频| 国产精品video| 香蕉成人久久| 亚洲午夜女主播在线直播| 国产精品日韩欧美一区二区三区| 一区二区三区视频观看| 亚洲亚洲精品三区日韩精品在线视频 | 欧美激情精品久久久久久大尺度| 亚洲国产小视频在线观看| 欧美国产免费| 欧美精品成人91久久久久久久| 亚洲免费激情| 亚洲一区区二区| 激情综合色丁香一区二区| 亚洲电影免费在线观看| 欧美日本不卡高清| 欧美一区二区高清在线观看| 欧美自拍丝袜亚洲| 亚洲区国产区| 亚洲网址在线| 一区二区三区在线观看欧美| 亚洲日本中文字幕| 国产亚洲视频在线| 亚洲国产精品久久久久久女王| 欧美视频国产精品| 鲁大师影院一区二区三区| 欧美sm视频| 久久国产精品色婷婷| 美女日韩欧美| 欧美一区二区三区视频| 久久在线视频在线| 亚洲男人第一网站| 久久另类ts人妖一区二区| 在线中文字幕一区| 欧美尤物巨大精品爽| 中文日韩在线视频| 久久精品99| 午夜在线视频一区二区区别| 久久久欧美精品| 亚洲一区二区三区中文字幕| 久久激情视频久久| 国产日韩一区二区| 国产精品高清网站| 欧美承认网站| 国产一区二区三区av电影| 亚洲第一福利在线观看| 国产亚洲成av人在线观看导航| 亚洲精品久久在线| 一区二区视频欧美| 亚洲欧美日韩在线高清直播| 99国产精品久久久久久久久久| 久久久久国内| 久久久精品久久久久| 国产精品激情av在线播放| 亚洲欧洲日产国产网站| 亚洲成在人线av| 久久成人国产| 久久精品国产精品| 国产精品综合| 国产精品99久久不卡二区| 日韩亚洲一区二区| 免费视频久久| 欧美大片免费观看在线观看网站推荐| 国产精品一区二区久久久久| 在线亚洲精品| 亚洲一区二区三区涩| 欧美吻胸吃奶大尺度电影| 亚洲另类黄色| 亚洲网站在线播放| 欧美精品97| 亚洲精品专区| 亚洲在线视频免费观看| 欧美日韩一区二区三区四区五区| 亚洲国产三级网| 亚洲精品国产精品久久清纯直播 | 国产欧美精品日韩区二区麻豆天美| 一区二区三区日韩精品视频| 亚洲在线免费| 国产亚洲欧洲997久久综合| 午夜国产精品视频免费体验区| 久久xxxx精品视频| 国内久久婷婷综合| 美女主播一区| 亚洲精选中文字幕| 欧美一区二区| 韩日成人av| 欧美精品偷拍| av成人天堂| 欧美伊人久久大香线蕉综合69| 国产日韩一区欧美| 久久久久久久久综合| 欧美激情一二三区| 亚洲性线免费观看视频成熟| 国产精品欧美激情| 久久国产精品一区二区| 欧美电影免费观看| 一本色道久久99精品综合 | 亚洲综合视频在线| 玖玖精品视频| 亚洲免费av网站| 欧美乱妇高清无乱码| 亚洲精品一区二区在线| 亚洲先锋成人| 在线成人中文字幕| 欧美精品videossex性护士| 欧美日韩美女一区二区| 99视频一区二区| 国产女主播一区二区三区| 性色av一区二区三区| 欧美jizz19性欧美| 亚洲综合电影| 亚洲人成人一区二区在线观看| 欧美体内谢she精2性欧美| 欧美在线观看视频在线| 亚洲伦理久久| 欧美11—12娇小xxxx| 亚洲色在线视频| 亚洲国产精品久久精品怡红院| 欧美日韩一区在线观看| 美女视频黄a大片欧美| 小黄鸭精品aⅴ导航网站入口| 亚洲国产欧美久久| 久久久欧美一区二区| 欧美影院成人| 亚洲欧美日韩成人| 亚洲高清一区二| 国产日韩精品在线播放| 欧美性天天影院| 欧美日韩一区成人| 亚洲精品美女在线观看| 国内精品写真在线观看| 国产日韩精品视频一区|