移动网站开发的视频下载,网站做的好坏主要看,企业品牌宣传型网站,阿里云空间部署网站吗拷贝构造函数
简单的说就是——用一个对象构造另外一个对象
class Myclass
{public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass(Myclass c) //拷贝构造函数{d c.d;}
};
//对比
class Myclass
{public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass…拷贝构造函数
简单的说就是——用一个对象构造另外一个对象
class Myclass
{public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass(Myclass c) //拷贝构造函数{d c.d;}
};
//对比
class Myclass
{public:int d0;Myclass(int d_){d d_}; //常用的构造函数Myclass(const Myclass c) //高效安全的拷贝构造函数{d c.d;}
};
//调用
int main()
{Myclass A(3);Myclass B(A);
}简单的说一下main中展示了两种构造对象的方式 一种是用了一般构造函数构造了对象A 一种是用了拷贝构造函数利用A构造了对象B 这里注意一下对比 展示了拷贝构造函数的写法后者传入参数用了常引用避免了一次形参到实参的拷贝同时const保护了A在函数内不被意外修改。
左值右值(会转换)
左值c中可以取地址的有名字的。
右值 不可取地址无名字
左值k变右值std::move(k);
移动构造函数
先给一个简单的例子
class A
{public:int* a;A(){anew int(2);}//普通的构造函数A(A a_out){a a_out.a;a_out.a nullptr;}//移动构造A(const A c_){a c_.a;c_.a nullptr;};//拷贝构造~A(){if(a!nullptr)delete a;}//析构函数
};
int main()
{A k A();A ak k; A ck std::move(ak);
}这里A 类型我们称为右值引用。
A k A();显然 A() 先调用了普通的构造函数然而由于是个右值(因为没有变量)。用来初始化k对象这里就调用了移动构造
我们利用左值k来初始化ak对象显然就是拷贝构造。
最后虽然ak是左值但是move运算后得到右值所以也是移动构造。
单例模式——懒汉模式(只有在调用的时候才初始化)
class Singletem
{public:static Singletem getitem(){static Singletem it;return it;} Singletem(const Singletem itt) delete;//禁用拷贝构造Singletem(Singletem itt) delete;//禁用移动构造Singletem operator(const Singletem itt) delete; //禁用拷贝赋值运算符//例如 Singletem A; Singletem B;// A B;Singletem operator(Sinletem itt) delete;//禁用移动赋值运算符 //例如 Singletem A;// A Singletem();private:Singletem();
};
或者写作
class noncopyable
{
protected:noncopyable() default;~noncopyable() default;noncopyable(const noncopyable itt) delete;//禁用拷贝构造noncopyable(noncopyable itt) delete;//禁用移动构造noncopyable operator(const noncopyable itt) delete; //禁用拷贝赋值运算符noncopyable operator(noncopyable itt) delete;//禁用移动赋值运算符
}
class Singletem:noncopyable
{public:static Singletem getitem(){static Singletem it;return it;} private:Singletem();
};这里有一个小细节operator返回的是引用这是为了链式法则例如ab2;
单例模式——饿汉模式(未经调用就先初始化)
class Singletem:noncopyable
{public:static Singletem getitem(){static Singletem it;return it;} private:static Singletem tem;Singletem();
};
Singletem Singletem::tem;//实例初始化
int main()
{
Singletem s1 Singletem::getitem();
Singletem s2 Singletem::getitem();
bool c s1s2;
return 1;
}