当前位置: 首页 > news >正文

网站开发技术支持软文广告营销

网站开发技术支持,软文广告营销,网站建设方案预算费用预算,怎么给公司做微网站强制生成 不生成 在C中,可以通过一些方式来控制编译器是否生成某些特殊成员函数(如默认构造函数、拷贝构造函数、拷贝赋值运算符、析构函数等)。 默认生成:如果你没有显式地定义这些特殊成员函数,编译器会自动生成它们…

强制生成 不生成

在C++中,可以通过一些方式来控制编译器是否生成某些特殊成员函数(如默认构造函数、拷贝构造函数、拷贝赋值运算符、析构函数等)。

  1. 默认生成:如果你没有显式地定义这些特殊成员函数,编译器会自动生成它们。这被称为默认生成。默认生成的成员函数会根据类的特性进行生成,例如默认构造函数会生成一个无参构造函数,拷贝构造函数会生成一个按值拷贝的构造函数。

  2. 强制生成:如果你显式地声明了某个特殊成员函数,但是不提供其定义,编译器将不会生成该函数的默认实现。这被称为强制生成。通过强制生成,你可以禁止某些特殊成员函数的自动生成,从而实现特定的语义或行为。

  3. 不生成:如果你显式地删除了某个特殊成员函数,编译器将不会生成该函数的默认实现。这被称为不生成。通过不生成,你可以禁止某些特殊成员函数的使用,从而防止不希望的行为或错误。

下面是一些示例代码,展示了如何强制生成或不生成特殊成员函数:

class MyClass {
public:// 强制生成默认构造函数MyClass() = default;// 强制生成拷贝构造函数MyClass(const MyClass& other) = default;// 不生成拷贝赋值运算符MyClass& operator=(const MyClass& other) = delete;// 强制生成析构函数~MyClass() = default;
};

在上面的示例中,我们通过使用default关键字来强制生成默认构造函数、拷贝构造函数和析构函数。同时,我们通过使用delete关键字来不生成拷贝赋值运算符。

需要注意的是,强制生成或不生成特殊成员函数是一种高级用法,需要谨慎使用。你应该根据具体的需求和设计来决定是否需要强制生成或不生成某些特殊成员函数。

// 以下代码在vs2013中不能体现,在vs2019下才能演示体现上面的特性。
class Person
{
public:Person(const char* name = "", int age = 0):_name(name), _age(age){}Person(const Person& p):_name(p._name), _age(p._age){}Person& operator=(const Person& p){if (this != &p){_name = p._name;_age = p._age;}return *this;}// 强制生成移动构造和移动赋值Person(Person&& p) = default;Person& operator=(Person&& p) = default;//不想生产(让Person对象拷贝)Person(const Person& p) = delete;~Person(){cout << "~Person()" << endl;}private:bit::string _name; // 自定义类型int _age = 1;		   // 内置类型};int main(){Person s1("张三", 18);Person s2 = s1;Person s3 = std::move(s1);cout << endl << endl;Person s4;s4 = std::move(s2);return 0;}

final || override

在C++中,finaloverride是两个关键字,用于对类的成员函数进行修饰和控制。

  1. final关键字:final用于修饰类、虚函数和成员函数,表示它们不能被继承、重写或覆盖。当一个类被声明为final时,其他类就不能从该类派生。当一个虚函数被声明为final时,它不能在派生类中被重写或覆盖。当一个非虚函数被声明为final时,它不能在派生类中被重新定义。
class Base final {// ...
};class Derived : public Base {  // 错误,Base类被声明为final,不能被继承// ...
};class Base {
public:virtual void foo() final {// ...}
};class Derived : public Base {
public:void foo() override {  // 错误,foo函数被声明为final,不能被重写// ...}
};
  1. override关键字:override用于修饰派生类中的虚函数,表示该函数是对基类中的虚函数的重写。使用override可以提高代码的可读性和安全性,确保派生类中的函数与基类中的虚函数具有相同的签名。
class Base {
public:virtual void foo() {// ...}
};class Derived : public Base {
public:void foo() override {  // 明确标记为重写虚函数// ...}
};

如果在派生类中使用了override关键字修饰一个函数,但该函数并不是基类中的虚函数,编译器将会报错。

总之,finaloverride是C++11引入的关键字,用于对类的成员函数进行修饰和控制。final表示类或函数不能被继承、重写或覆盖,而override表示派生类中的函数是对基类中虚函数的重写。

要求delete关键字实现,一个类,只能在堆上创建对象

当构造函数被声明为私有时,它只能在类的内部被访问。这意味着在类的外部无法直接调用构造函数来创建对象。因此,将构造函数设为私有可以阻止类在栈上创建对象的方式。

在C++中,当你在栈上声明一个对象时,编译器会在编译时自动调用类的构造函数来创建对象。但是,如果构造函数是私有的,编译器将无法调用该构造函数,从而阻止了在栈上创建对象的方式。

以下是一个示例代码,展示了私有构造函数如何阻止类在栈上创建对象的方式:

class MyClass {
private:MyClass() {}  // 私有的构造函数public:void doSomething() {// 对象的成员函数}
};int main() {MyClass obj;  // 编译错误!无法调用私有构造函数return 0;
}

在上面的示例中,我们将构造函数声明为私有的,然后在main()函数中尝试在栈上创建一个MyClass对象。由于构造函数是私有的,编译器将无法调用该构造函数,从而导致编译错误。

需要注意的是,尽管无法在栈上直接创建对象,但仍然可以通过其他方式(如静态成员函数或友元函数)在堆上创建对象。

class HeapOnly
{
public:~HeapOnly() = delete;
};
int main()
{//HeapOnly hp1;//static HeapOnly hp2;          //自定义类型会调用析构HeapOnly* ptr = new HeapOnly;  //指针不会调用析构return 0;
}

下面例子此时会有资源泄露

class HeapOnly
{
public:HeapOnly(){_str = new char[10];}~HeapOnly() = delete;
private:char* _str;
};
int main()
{//HeapOnly hp1;//static HeapOnly hp2;          //自定义类型会调用析构HeapOnly* ptr = new HeapOnly;  //指针不会调用析构//delete ptr;                  //无析构 不能deletereturn 0;
}

自写destroy解决

// 要求delete关键字实现,一个类,只能在堆上创建对象
class HeapOnly
{
public:HeapOnly(){_str = new char[10];}~HeapOnly() = delete;void Destroy(){delete[] _str; operator delete(this);}
private:char* _str;
};
int main()
{//HeapOnly hp1;//static HeapOnly hp2;          //自定义类型会调用析构HeapOnly* ptr = new HeapOnly;  //指针不会调用析构//delete ptr;                  //无析构 不能deleteptr->Destroy();return 0;
}

可变参数模板

在这里插入图片描述

//可变参数的函数模板
template <class ...Args>
void ShowList(Args... args)
{cout<< sizeof...(args) <<endl;  //计算几个参数
}
int main()
{string str("hello");ShowList(1);ShowList();ShowList(1, 2);ShowList(1, 'A', str);return 0;
}

在这里插入图片描述
递归看参数

//可变参数的函数模板
void ShowList()
{cout << endl;
}template <class T, class ...Args>
void ShowList(const T& val, Args... args)
{cout << val << " ";ShowList(args...);//cout<< sizeof...(args) <<endl;
}
int main()
{string str("hello");ShowList(1);ShowList();ShowList(1, 2);ShowList(1, 'A', str);return 0;
}

结果

11 2
1 A hello

列表初始化获取

template<class T>
int PrintArg(const T& x)
{cout << x << " ";return 0; 
}
template <class ...Args>
void ShowList(Args... args)
{int a[] = { PrintArg(args)... };cout << endl;
}
int main()
{string str("hello");ShowList(1);ShowList();ShowList(1, 2);ShowList(1, 'A', str);return 0;
}

emplace

emplace_back()是C++标准库容器(如vector、list和deque)提供的一个成员函数,用于在容器的末尾直接构造对象,而不需要显式地调用构造函数。

emplace_back()的优势主要体现在以下几个方面:

  1. 减少对象的拷贝或移动:使用emplace_back()可以直接在容器的末尾构造对象,而不需要先创建一个临时对象,然后再将其拷贝或移动到容器中。这样可以减少不必要的对象拷贝或移动操作,提高代码效率。

  2. 简化代码:相比于显式地调用构造函数和push_back()函数,使用emplace_back()可以更简洁地创建对象并将其添加到容器中。你只需要传递构造函数所需的参数,而不需要创建临时对象或手动调用构造函数。

  3. 支持完美转发:emplace_back()函数支持完美转发,可以将参数直接传递给构造函数,无需手动进行类型转换。这意味着你可以使用不同类型的参数来构造对象,而不需要为每个类型编写重载的构造函数。

以下是一个使用emplace_back()的示例代码:

#include <vector>class MyClass {
public:MyClass(int x, int y) {// 构造函数的实现}
};int main() {std::vector<MyClass> myVector;myVector.emplace_back(10, 20);  // 在容器的末尾构造对象return 0;
}

在上面的示例中,我们使用emplace_back()函数在myVector容器的末尾直接构造了一个MyClass对象,而不需要先创建一个临时对象。

总而言之,emplace_back()函数可以提高代码的效率和可读性,减少对象的拷贝或移动,并支持完美转发,使代码更加简洁和灵活。

emplace支持参数包
在这里插入图片描述

定位new

内存池 显示的调用构造函数

lambda

在这里插入图片描述
在这里插入图片描述
简单的lambda函数

int mian()
{//两个数相加的lambdaauto add1 = [](int a, int b)->int{return a + b; };cout << add1(1, 2) << endl;//省略返回值auto add2 = [](int a, int b){return a + b; };cout << add2(1, 2) << endl;//交换变量的lambdaint x = 0,  y = 1;auto swap1 = [](int& x1, int& x2)->void {int tmp = x1; x1 = x2; x2 = tmp; };swap1(x, y);cout << x << ":" << y << endl;auto swap2 = [](int& x1, int& x2){int tmp = x1; x1 = x2; x2 = tmp; };swap2(x, y);cout << x << ":" << y << endl;//不传参数交换x,y  lambda  --捕捉列表  (默认捕捉过来的变量不能修改 加mutable)//auto swap3 = [x, y]()mutable   //无修改作用auto swap3 = [&x, &y]()   //传引用捕捉{int tmp = x;x = y;y = tmp;};swap3();cout << x << ":" << y << endl;return 0;
}

lambda作为sort的参数(之前用反函数对象或者类型实现)

	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._name <g2._name; });
http://www.hrbkazy.com/news/7495.html

相关文章:

  • 那家网站做的效果好免费二级域名查询网站
  • asp网上书店网站开发网站搜索优化排名
  • 南京公司做网站西安百度爱采购推广
  • 智能网站建设哪家效果好百度经验官网
  • 做网站虚拟主机要多大网站怎么打开
  • 上海新任委书记seo营销专员
  • 网站二级联菜单怎么做seo站长网怎么下载
  • 网站栏目结构优化温州企业网站排名优化
  • 北京海淀区有哪些企业网络营销乐云seo
  • 音乐网站建设价格莆田网站建设优化
  • 一个网站交互怎么做的进行seo网站建设
  • 制作网站的程序网站生成app工具
  • 网站建设bz3399seo门户网站建设方案
  • 网站中的作用怎么创作自己的网站
  • 字体在线生成器济南seo的排名优化
  • 素材最多的网站营销策略有哪几种
  • 广州交易中心搜索引擎优化的英文
  • 化妆品网站html模板常州网站优化
  • 微信做网站的公司seo实战密码
  • 济南企业做网站网站搭建需要多少钱?
  • b站推广入口2024mmmseo网络营销招聘
  • 短视频营销ppt上海关键词排名优化怎样
  • 全国各大知名网站文案代写在哪里接单子
  • 百度云搜索引擎网站武汉网站建设推广公司
  • 找生意做去哪个网站广州网站营销推广
  • 用网站做宣传的费用seo外包大型公司
  • 品牌策划公司网站seo搜索优化公司
  • 俄文网站商城建设自己建个网站要多少钱
  • 有了域名如何建设网站百度账户代运营
  • 做彩票网站要多少钱北京官网seo