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

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>
            亚洲高清二区| 久久综合狠狠综合久久综合88| 国产真实乱偷精品视频免| 欧美激情中文字幕乱码免费| 欧美亚洲一区二区三区| 在线视频亚洲欧美| 91久久在线播放| 免费在线看成人av| 欧美在线观看一区二区三区| 一片黄亚洲嫩模| 在线观看欧美日韩国产| 国产一区二区精品久久| 国产精品色午夜在线观看| 欧美日韩国产欧| 免费永久网站黄欧美| 久久久久久久999精品视频| 亚洲综合精品一区二区| 99国产精品视频免费观看一公开| 欧美大片一区二区三区| 蜜桃av一区二区三区| 久久久久久久一区二区三区| 欧美一区成人| 性欧美精品高清| 欧美一区二区三区免费大片| 亚洲欧美国产高清| 亚洲一区二区成人| 亚洲视频中文字幕| 亚洲少妇中出一区| 亚洲无线一线二线三线区别av| 最近看过的日韩成人| 亚洲国产精品久久久| 亚洲国产成人午夜在线一区| 影音先锋亚洲精品| 在线精品一区二区| 亚洲国产精品久久久久| 尤物精品在线| 91久久国产精品91久久性色| 91久久国产自产拍夜夜嗨| 亚洲日本成人| 亚洲青色在线| 99这里只有久久精品视频| 正在播放欧美视频| 亚洲免费在线视频一区 二区| 亚洲欧美亚洲| 久久精品30| 免费观看日韩| 亚洲激情综合| 亚洲小说欧美另类婷婷| 亚洲一区制服诱惑| 久久se精品一区精品二区| 久久综合导航| 欧美精品在线一区| 国产精品久久久久久久久久久久| 国产欧美日韩一区二区三区在线| 国产一区二区你懂的| 亚洲国产日韩综合一区| 亚洲最新在线视频| 性欧美暴力猛交另类hd| 老司机精品福利视频| 91久久久久久| 亚洲综合精品四区| 另类天堂av| 国产精品a久久久久| 国色天香一区二区| 99re热精品| 久久精品二区三区| 亚洲国产成人午夜在线一区| 亚洲一区二区黄色| 久久精品中文| 欧美日本精品一区二区三区| 国产精品亚洲综合一区在线观看| **性色生活片久久毛片| 亚洲午夜电影在线观看| 老司机精品久久| 9色国产精品| 久久久中精品2020中文| 欧美视频一区在线| 亚洲电影av| 欧美一二三区在线观看| 欧美激情日韩| 午夜一级在线看亚洲| 欧美国产日韩xxxxx| 国产区精品在线观看| 日韩视频一区二区三区在线播放免费观看 | 亚洲国产高清高潮精品美女| 一本色道久久综合狠狠躁篇的优点| 欧美一级视频精品观看| 亚洲第一主播视频| 亚洲欧美日韩精品久久久久| 欧美激情在线观看| 怡红院av一区二区三区| 亚洲欧美日本精品| 亚洲国内欧美| 久久精品中文字幕一区| 国产精品自拍三区| 一区二区电影免费在线观看| 欧美成人性生活| 欧美制服丝袜第一页| 国产精品av免费在线观看| 亚洲精品亚洲人成人网| 卡通动漫国产精品| 亚洲欧美bt| 国产精品久久99| 一本在线高清不卡dvd| 免费欧美日韩| 久久精品99久久香蕉国产色戒| 国产精品你懂的在线| 中国日韩欧美久久久久久久久| 欧美风情在线观看| 久久夜色精品亚洲噜噜国产mv| 国产亚洲一区精品| 欧美一区二区三区免费观看| 一区二区三区四区五区精品| 欧美日本中文| 99热在这里有精品免费| 亚洲电影有码| 欧美顶级艳妇交换群宴| 亚洲韩日在线| 亚洲第一在线综合网站| 欧美凹凸一区二区三区视频| 伊人春色精品| 免费日韩成人| 久久天天躁狠狠躁夜夜爽蜜月| 国产综合色一区二区三区| 久久精品一区二区国产| 欧美一区二区视频观看视频| 国产伦精品一区二区三区视频黑人| 午夜精品久久久久久久久久久久久| 99re热这里只有精品视频| 欧美日韩一区成人| 亚洲一卡二卡三卡四卡五卡| 一区二区三区久久久| 国产精品久久久久aaaa樱花| 先锋亚洲精品| 欧美在线播放| 在线观看欧美日韩| 欧美激情影音先锋| 欧美日本精品在线| 亚洲欧美清纯在线制服| 亚洲免费一区二区| 国产专区精品视频| 欧美高清在线视频| 欧美久久久久久久| 亚洲欧美日韩精品久久久久| 亚洲欧美中文另类| 娇妻被交换粗又大又硬视频欧美| 欧美aⅴ99久久黑人专区| 另类酷文…触手系列精品集v1小说| 亚洲三级影院| 一区二区三区视频在线观看| 国产精品免费看久久久香蕉| 久久九九99视频| 蜜桃av综合| 亚洲影院在线| 久久精品三级| 99成人在线| 午夜日韩福利| 最新成人在线| 亚洲视频免费在线观看| 国外成人免费视频| 亚洲激情网址| 国产人成一区二区三区影院 | 99pao成人国产永久免费视频| 国产精品福利久久久| 久久亚裔精品欧美| 欧美理论电影网| 欧美一区在线直播| 欧美va亚洲va香蕉在线| 亚洲欧美成人在线| 老司机亚洲精品| 先锋亚洲精品| 欧美国产日产韩国视频| 欧美一区国产一区| 欧美成人免费全部| 久久精品一本| 欧美美女福利视频| 久久亚洲影院| 国产精品萝li| 亚洲国产成人高清精品| 国产午夜久久久久| 亚洲伦理一区| 亚洲国产高清自拍| 亚洲综合不卡| 在线午夜精品自拍| 狂野欧美激情性xxxx欧美| 性娇小13――14欧美| 欧美成人a视频| 久久久久久午夜| 国产精品久久网| 亚洲三级国产| 亚洲黄色精品| 久久本道综合色狠狠五月| 亚洲一区黄色| 欧美黄色一区二区| 老司机免费视频久久| 国产精品亚洲精品| 一区二区三区四区五区在线| 亚洲精品自在在线观看| 久久亚洲美女| 久久久久久亚洲综合影院红桃 |