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

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 魏尚堂 閱讀(162) | 評論 (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 魏尚堂 閱讀(165) | 評論 (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 魏尚堂 閱讀(230) | 評論 (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 魏尚堂 閱讀(164) | 評論 (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 魏尚堂 閱讀(238) | 評論 (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 魏尚堂 閱讀(688) | 評論 (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 魏尚堂 閱讀(612) | 評論 (0)編輯 收藏

2013年1月17日

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

posted @ 2013-01-17 14:01 魏尚堂 閱讀(166) | 評論 (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 魏尚堂 閱讀(155) | 評論 (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>
            午夜在线观看免费一区| 一区二区三区日韩精品视频| 欧美金8天国| 欧美激情性爽国产精品17p| 性刺激综合网| 亚洲欧美国产一区二区三区| 亚洲精品一区二区三区福利| 狠狠色狠狠色综合人人| 国产农村妇女精品一区二区| 国产精品自在欧美一区| 欧美成人一区二区三区| 亚洲视频www| 一本久久综合亚洲鲁鲁| 99re66热这里只有精品3直播| 亚洲国产你懂的| 欧美高清视频一区二区三区在线观看 | 野花国产精品入口| 亚洲人成网站色ww在线| 在线免费观看成人网| 亚洲黄一区二区三区| 亚洲国产日韩在线一区模特| 久久精品30| 另类专区欧美制服同性| 亚洲国产另类久久精品| 久久男人资源视频| 狠狠色丁香久久婷婷综合_中| 国产精品自在在线| 国产农村妇女毛片精品久久麻豆| 欧美日韩一区高清| 欧美mv日韩mv国产网站| 欧美国产日本在线| 欧美日韩国产亚洲一区| 欧美日韩一区二区三区在线视频| 国产精品大片| 国产在线成人| 日韩亚洲成人av在线| 亚洲欧美在线免费观看| 久久婷婷人人澡人人喊人人爽 | 国产精品二区三区四区| 国产日韩欧美电影在线观看| 黄色在线成人| 99国产精品国产精品久久| 久久深夜福利| 亚洲人体1000| 亚洲美女黄色片| 亚洲国产精品一区二区第四页av | 麻豆精品网站| 蜜臀va亚洲va欧美va天堂| 欧美中日韩免费视频| 欧美激情中文字幕一区二区| 国产亚洲毛片在线| 99精品国产高清一区二区| 欧美一区二区三区视频免费| 亚洲缚视频在线观看| 欧美亚洲三区| 国产精品久久久久久久久久ktv| 国产精品国产三级国产aⅴ入口| 亚洲高清免费在线| 久久精品一区蜜桃臀影院| 一区二区高清视频| 欧美成人综合一区| 国产一区视频观看| 性高湖久久久久久久久| 亚洲激情网站| 性感少妇一区| 男女激情视频一区| 黄色成人小视频| 欧美一区永久视频免费观看| 日韩视频在线一区二区| 欧美顶级少妇做爰| 国产精品入口尤物| 狼狼综合久久久久综合网| 99精品国产一区二区青青牛奶| 香蕉成人啪国产精品视频综合网| 欧美日韩免费一区| 亚洲精品美女久久7777777| 老司机67194精品线观看| 欧美激情一区二区久久久| 欧美一区二区精品| 国产一区二区三区网站| 久久精品国亚洲| 亚洲综合视频1区| 国产精品夜夜嗨| 午夜精品久久久久久久久久久久久 | 国产精品久久久久国产精品日日| av成人免费观看| 亚洲国产精品久久久久久女王| 久久久九九九九| 国产精品久久久久一区二区三区| 亚洲视频专区在线| 久久久噜噜噜久久人人看| 欧美一区国产一区| 国产最新精品精品你懂的| 久久精品一区| 久久精品99国产精品日本| 伊人色综合久久天天| 欧美成人免费全部| 免费亚洲一区二区| 国内精品免费在线观看| 欧美高清视频在线播放| 欧美激情在线免费观看| 亚洲一区二区欧美日韩| 亚洲一区二区三区激情| 国产一区二区黄| 亚洲国产成人久久| 国产精品伦理| 久久一本综合频道| 男同欧美伦乱| 亚洲国产欧美另类丝袜| 亚洲第一区在线观看| 欧美日韩伦理在线免费| 欧美在线免费观看视频| 亚洲图色在线| 亚洲国产婷婷综合在线精品| 久久裸体视频| 欧美精品色网| 久久精品伊人| 欧美日韩成人在线播放| 欧美在线精品免播放器视频| 蜜臀av一级做a爰片久久| 亚洲欧美日韩中文视频| 久久三级福利| 午夜欧美大片免费观看| 美女视频黄 久久| 午夜国产精品视频免费体验区| 久久精品中文| 亚洲欧美日韩国产成人精品影院| 久久久久久久久蜜桃| 国内精品美女在线观看| 伊人久久亚洲影院| 免费看精品久久片| 欧美日韩妖精视频| 裸体女人亚洲精品一区| 国产精品扒开腿爽爽爽视频| 欧美不卡三区| 国产一区二区中文字幕免费看| 亚洲黄色成人久久久| 国外成人在线视频网站| 亚洲网友自拍| 亚洲一区日韩在线| 欧美福利视频在线| 亚洲永久免费观看| 欧美一二三视频| 中文在线不卡视频| 欧美不卡高清| 欧美高清在线视频| 韩日视频一区| 性欧美激情精品| 亚洲在线不卡| 欧美亚洲成人精品| 99热免费精品在线观看| 中文高清一区| 欧美性猛交视频| 午夜精品婷婷| 欧美波霸影院| 亚洲午夜精品一区二区三区他趣| 国产精品久久久久久久免费软件 | 亚洲视频在线一区| 国产性猛交xxxx免费看久久| 久久全国免费视频| 亚洲欧洲在线视频| 亚洲欧美日韩精品久久亚洲区| 国产目拍亚洲精品99久久精品 | 日韩一区二区高清| 欧美在线看片a免费观看| 亚洲激情第一页| 欧美日韩在线播| 欧美一区二区高清在线观看| 亚洲激情电影在线| 亚洲欧美一区二区在线观看| 在线色欧美三级视频| 欧美日一区二区三区在线观看国产免| 亚洲欧美国产毛片在线| 欧美激情麻豆| 欧美一区二区日韩| 亚洲日韩欧美视频一区| 国产免费亚洲高清| 欧美日韩国产综合久久| 久久精品国产77777蜜臀| 亚洲精品视频啊美女在线直播| 久久国产精品久久w女人spa| 99热在线精品观看| 国产日韩专区| 欧美日韩亚洲一区二区三区在线观看| 久久精品综合| 亚洲在线免费观看| 亚洲精品人人| 母乳一区在线观看| 久久成人在线| 羞羞视频在线观看欧美| 一区二区三区日韩精品| 亚洲国产欧美不卡在线观看| 欧美日韩色综合| 欧美电影免费| 欧美一区二区三区四区在线观看地址| 亚洲人成在线播放| 精品成人久久| 国产日韩精品在线| 国产精品露脸自拍| 欧美日韩国产探花|