伙头军传奇,穆里尼奥下跪,av77
stl源码学习(版本2.91)--list
1,默认构造函数的作用和被调用的时机
struct no{ no(int i){} //no(){ // std::cout << "s" << std::endl; //} long data; }; struct a{ no n; }; int main(){ a a; }
这段代码报错,提示无法构造a类的a对象,编译器会给a类提供默认构造函数,但是a类的默认构造函数去构造它成员no类的n时,发现no类没有构造函数(理由:因为自己定义了no(int)构造函数,所以编译器就不提供no类的默认构造函数了),所以就无法构造n对象,也就无法构造a对象了。
1.cpp: in function ‘int main()’: 1.cpp:22:5: error: use of deleted function ‘a::a()’ a a; ^ 1.cpp:12:8: note: ‘a::a()’ is implicitly deleted because the default definition would be ill-formed:
2,allocator和定位new的用法
stl_list.h源码节选
template <class t> struct __list_node { typedef void* void_pointer; void_pointer next; void_pointer prev; t data; }; template <class t, class alloc = alloc> class list { protected: typedef __list_node<t> list_node; typedef simple_alloc<list_node, alloc> list_node_allocator; public: typedef list_node* link_type; protected: link_type node;//list唯一的成员,是end()函数的返回值 public: list() { empty_initialize(); } protected: void empty_initialize() { node = get_node(); node->next = node; node->prev = node; } protected: link_type get_node() { return list_node_allocator::allocate(); } link_type create_node(const t& x) { link_type p = get_node(); __stl_try { construct(&p->data, x); } __stl_unwind(put_node(p)); return p; } s iterator insert(iterator position, const t& x) { link_type tmp = create_node(x); tmp->next = position.node; tmp->prev = position.node->prev; (link_type(position.node->prev))->next = tmp; position.node->prev = tmp; return tmp; }
stl_alloc.h
template<class t, class alloc> class simple_alloc { public: static t *allocate(size_t n) { return 0 == n? 0 : (t*) alloc::allocate(n * sizeof (t)); } static t *allocate(void) { return (t*) alloc::allocate(sizeof (t)); }
stl_construct.h
template <class t1, class t2> inline void construct(t1* p, const t2& value) { new (p) t1(value); }
从以上的stl list源码可以看出:
c/c++ 学习互助qq群:877684253
本人微信:xiaoshitou5854
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论