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

实验楼编程网站市场营销方案

实验楼编程网站,市场营销方案,信阳电子商务网站建设,湖北省建设厅建筑资料官方网站👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、再谈构造函数
    • 1.1 构造函数体赋值
    • 1.2 初始化列表
    • 1.3 为什么C++要设计初始化列表
      • 1. 若类中的成员变量包含`const`类型,必须在初始化列表位置进行初始化
      • 2. 若类中的成员变量包含`引用`类型,必须在初始化列表位置进行初始化
      • 3. 当成员变量是自定义类型,且该类没有默认构造函数时,必须在初始化列表位置进行初始化
    • 1.4 扫尾补充
  • 二、explicit关键字
  • 三、static成员
    • 3.1 概念
    • 3.2 特性
    • 3.3 面试题
    • 3.4 使用静态成员变量的好处

一、再谈构造函数

1.1 构造函数体赋值

以下代码是在创建对象时,编译器通过构造函数,给对象中各个成员变量一个合适的初始值。

using namespace std;class Date
{
public:Date(int year, int month, int day){Year = year;Month = month;Day = day;}void Print(){cout << Year << '-' << Month << '-' << Day << endl;}
private:int Year;int Month;int Day;
};int main()
{Date d1(2023, 1, 1);d1.Print();return 0;
}

【程序结果】

在这里插入图片描述

若对象调用了以上的构造函数,则对象就有了一个初始值。但这不能称其为对象成员中成员变量的初始值。因为初始化只能初始化一次,而构造函数体内可以多次赋值。因此,构造函数体中的语句只能叫做赋值,而不是初始化。

1.2 初始化列表

那成员变量该如何初始化呢?我们一起来看看下面的代码:

#include <iostream>
using namespace std;class Date
{
public:Date(int year = 2023, int month = 5, int day = 23):Year(year),Month(month),Day(day){}void Print(){cout << Year << '-' << Month << '-' << Day << endl;}
private:int Year;int Month;int Day;
};int main()
{Date d1;d1.Print();return 0;
}

【程序结果】

在这里插入图片描述

语法:以冒号开始,接着以逗号分割数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。

1.3 为什么C++要设计初始化列表

有的人想,构造函数赋值好像就可以满足平时的代码需求。但对于某些数据类型,只能在初始化时进行赋值。

1. 若类中的成员变量包含const类型,必须在初始化列表位置进行初始化

【在构造函数体内给值的情况】

#include <iostream>
using namespace std;class A
{
public:A(int x = 1){i = x;}private:const int i;
};int main()
{A aa1(2);return 0;
}

【错误报告】

在这里插入图片描述

【正确做法:在初始化列表初始化】

#include <iostream>
using namespace std;class A
{
public:A(int x = 1):i(x){}void Print(){cout << i << endl;}
private:const int i;
};int main()
{A aa1(3);aa1.Print();return 0;
}

【程序结果】

在这里插入图片描述

2. 若类中的成员变量包含引用类型,必须在初始化列表位置进行初始化

【在构造函数体内给值的情况】

#include <iostream>
using namespace std;class A
{
public:A(int x = 1){i = x;}void Print(){cout << i << endl;}
private:int& i;
};int main()
{A aa1(3);aa1.Print();return 0;
}

【错误报告】

在这里插入图片描述

【正确做法:在初始化列表初始化】

#include <iostream>
using namespace std;class A
{
public:A(int &x):i(x){}void Print(){cout << i << endl;}
private:int& i;
};int main()
{int a = 3;A aa1(a);aa1.Print();return 0;
}

【程序结果】

在这里插入图片描述

【补充】

  1. 为什么const引用类型需要在初始化列表给值?
    原因如下:
    引用和const的特征:必须在定义的时候初始化。 因为const修饰的变量在定义后不能被修改;同样的,引用在定义时,必须初始化,并且一旦引用一个变量,就再也不能引用其他变量。又因为构造函数体内可以多次赋值,因此导致报错。
  2. 每个成员变量在初始化列表中最多只能出现一次(初始化只能初始化一次),当然也可以不初始化

【错误展示】

在这里插入图片描述

3. 当成员变量是自定义类型,且该类没有默认构造函数时,必须在初始化列表位置进行初始化

默认构造函数:无参构造、全缺省构造、编译器自动生成的构造函数(自身不定义的情况)

【错误展示】

#include <iostream>
using namespace std;class A
{
public:A(int c) // 不是默认构造函数{x = c;}
private:int x;
};class B
{
public:B(int i = 3):x(i){}
private:A a;int x;
};

【错误报告】

在这里插入图片描述

【正确做法:初始化列表给值】

#include <iostream>
using namespace std;class A
{
public:A(int c):d(c){}
private:int d;
};class B
{
public:B(int i = 3):x(i),a(22){}
private:A a;int x;
};int main()
{B b1;return 0;
}

【结果】

在这里插入图片描述

1.4 扫尾补充

  • 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。但需要注意的是:初始化列表并不能百分之百完成所有初始化工作。例如:
#include <iostream>
using namespace std;class Stack
{
public:Stack(int default_capacity = 4):a((int*)malloc(sizeof(int) * default_capacity)),top(0),capacity(default_capacity){// 断言if (a == nullptr){return;}// 初始化memset(a, 0, sizeof(int) * capacity);}private:int* a;int top;int capacity;
};int main()
{Stack s1;return 0;
}

【结果展示】

在这里插入图片描述

  • 注意:初始化列表的初始化顺序一定是根据成员变量在类中声明顺序而定的

看看一下程序,就是因为没有根据成员变量在类中声明顺序,导致出现随机值

using namespace std;class A
{
public:A(int a):a1(a), a2(a1){}void Print() {cout << a1 << " " << a2 << endl;}
private:int a2;int a1;
};
int main() 
{A a(1);a.Print();return 0;
}

【解释 + 结果】

在这里插入图片描述

二、explicit关键字

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。

#include <iostream>
using namespace std;class A
{
public:A(int x):a(x){}void Print(){cout << a << endl;}
private:int a;
};int main()
{A a1(1); // 调用构造A a2 = 2; // 隐式类型转化 a1.Print();a2.Print();return 0;
}

【结果展示】

在这里插入图片描述

A a1(1)毋庸置疑调用的是构造函数,而对于A a2 = 2单个参数是具有 类型转换 的作用。其隐式转化过程:用2去调用构造函数生成一个A类型的临时变量,临时变量再通过拷贝构造给a2
在这里插入图片描述

但需要注意的是:对于这种连续的构造,编译器会直接优化用直接构造。代码说话:

#include <iostream>
using namespace std;class A
{
public:// 构造函数A(int x):a(x){cout << "调用了构造函数" << endl;}// 拷贝构造函数A(const A& d):a(d.a){cout << "调用了拷贝构造函数" << endl;}void Print(){cout << a << endl;}
private:int a;
};int main()
{A a2 = 2; // 隐式类型转化 a2.Print();return 0;
}

【程序结果】

在这里插入图片描述

若不想有这样的隐式转化,可以在构造函数前加上explicit,这样编译器就不支持隐式转化了

在这里插入图片描述

三、static成员

3.1 概念

声明为static类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数

3.2 特性

  1. 要注意区分成员变量和静态成员变量。成员变量属于每一个类对象,存储在对象里;而静态成员变量属于类,属于类的每个对象共享,不属于某个具体的对象,存储在静态区。
  2. 静态成员变量必须在类外定义,(是不受publicprotectedprivate 访问限定符的限制)。定义时不添加static关键字,类中只是声明
  • 类外定义的原因:
    静态成员变量属于类,而不属于每一个类对象。因此,它们在内存中只有一份副本,不会随着类的对象的创建和销毁而变化。当我们在类定义中声明一个静态成员变量时,它只是一个声明,它并没有在内存中分配存储空间。因此,我们必须在类外部的某个地方为其分配存储空间,这样才能让它真正存在于内存中。因此,静态成员变量必须在类外定义,这样编译器才知道要为它分配存储空间。同时,我们也可以在类外初始化这个静态成员变量。
  1. 静态成员也是类的成员,受publicprotectedprivate 访问限定符的限制。因此,类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
    4. 静态成员函数没有隐藏的this指针,指定类域和访问限定符就可以访问静态成员变量和静态成员函数
  • 为什么静态成员函数没有隐藏的this指针?
    静态成员函数是属于类的,而不是属于类的某个对象,因此在静态成员函数中没有隐含的 this 指针。this 指针是指向当前对象的指针,因此只能在非静态成员函数中使用。而静态成员函数不依赖于具体的对象,只依赖于类本身,所以无需this 指针。在静态成员函数中,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非静态成员函数。
  • 静态成员函数可以调用非静态成员函数吗?
    不可以。调用非静态的成员函数需要this指针,而静态成员函数没有隐藏的this指针
  • 非静态成员函数可以调用类的静态成员函数吗?
    可以。因为调用静态成员函数不需要this指针

3.3 面试题

根据以上static成员的概念和特征,我们来做一个经典面试题

  • 实现一个类,计算程序中创建出了多少个类对象
#include <iostream>
using namespace std;class A
{
public:// 构造函数// 每次创建对象时自增 countA() { count++; }// 拷贝构造函数// 每次创建对象时自增 countA(const A& x) { count++; }// 析构函数// 每次销毁对象时自减 count~A() { count--;}//指定类域和访问限定符//就可以访问静态成员变量和静态成员函数static int GetACount() { return count; }
private:// 静态成员变量static int count;
};// 静态成员变量必须在类外定义,
// 定义时不添加static关键字
int A::count = 0;int main()
{// 如果直接想访问类中的count是不行的// 因此我们首先想到成员函数cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;return 0;
}
  • 在类中,定义了一个静态成员变量count,用于统计当前类对象的数量。每次创建对象时,构造函数和拷贝构造函数会自增count,每次销毁对象时,析构函数会自减count
  • 在主函数中,我们创建了三个对象 a1a2a3,并输出当前对象数量。第一次输出并没有创建对象,因此输出0;第二次分别创建了a1a2,这两个都调用了构造函数,此时count = 2,接着又通过a1拷贝构造a3count再自增1,所以第二次count3

【结果展示】

在这里插入图片描述

3.4 使用静态成员变量的好处

  1. 全局性:静态成员变量是属于类的,而不是属于类的某个对象。因此,它可以被所有类的对象共享,具有全局性。

  2. 生命周期长:静态成员变量在程序运行期间只会被创建一次,它的生命周期长,可以一直存在于内存中,直到程序结束。

  3. 方便访问:由于静态成员变量是属于类的,因此可以通过类名直接访问,不需要先创建类的对象。

  4. 数据共享:静态成员变量可以用于实现数据共享,多个对象可以共享同一个静态成员变量,达到节省内存空间的目的。

  5. 保护数据:静态成员变量可以被用于保护数据,将数据设为私有的静态成员变量,只能通过类的公共接口来访问,从而保护数据的安全性。


文章转载自:
http://piaster.xkzr.cn
http://menstrua.xkzr.cn
http://okazaki.xkzr.cn
http://glamorgan.xkzr.cn
http://capercaillie.xkzr.cn
http://sirventes.xkzr.cn
http://mabe.xkzr.cn
http://metaphrase.xkzr.cn
http://typeface.xkzr.cn
http://sugarplum.xkzr.cn
http://kendo.xkzr.cn
http://ciliated.xkzr.cn
http://cupreous.xkzr.cn
http://gewgawish.xkzr.cn
http://grasstex.xkzr.cn
http://iranair.xkzr.cn
http://smart.xkzr.cn
http://airfoil.xkzr.cn
http://miscreated.xkzr.cn
http://suntan.xkzr.cn
http://dilatometer.xkzr.cn
http://windowy.xkzr.cn
http://wobbly.xkzr.cn
http://grecism.xkzr.cn
http://disinclination.xkzr.cn
http://booty.xkzr.cn
http://nite.xkzr.cn
http://apatetic.xkzr.cn
http://trappings.xkzr.cn
http://nazarite.xkzr.cn
http://limean.xkzr.cn
http://unshelled.xkzr.cn
http://somatological.xkzr.cn
http://priss.xkzr.cn
http://autoerotism.xkzr.cn
http://leadswinging.xkzr.cn
http://hypaesthesia.xkzr.cn
http://zenocentric.xkzr.cn
http://blastomycete.xkzr.cn
http://surd.xkzr.cn
http://municipalize.xkzr.cn
http://lapidification.xkzr.cn
http://multichannel.xkzr.cn
http://houseplace.xkzr.cn
http://congelation.xkzr.cn
http://soother.xkzr.cn
http://coccyx.xkzr.cn
http://geometrid.xkzr.cn
http://revise.xkzr.cn
http://delate.xkzr.cn
http://aswandam.xkzr.cn
http://ostein.xkzr.cn
http://outwell.xkzr.cn
http://experimentative.xkzr.cn
http://drupaceous.xkzr.cn
http://kibbutznik.xkzr.cn
http://srna.xkzr.cn
http://bannerline.xkzr.cn
http://buncombe.xkzr.cn
http://syncretise.xkzr.cn
http://greasy.xkzr.cn
http://bromberg.xkzr.cn
http://yawl.xkzr.cn
http://youthen.xkzr.cn
http://omicron.xkzr.cn
http://androgenize.xkzr.cn
http://telephonable.xkzr.cn
http://halide.xkzr.cn
http://appendicitis.xkzr.cn
http://ontogenesis.xkzr.cn
http://hundredweight.xkzr.cn
http://ensile.xkzr.cn
http://utilizable.xkzr.cn
http://airscrew.xkzr.cn
http://cager.xkzr.cn
http://leptospirosis.xkzr.cn
http://picot.xkzr.cn
http://sinful.xkzr.cn
http://vizard.xkzr.cn
http://inceptisol.xkzr.cn
http://unwind.xkzr.cn
http://abeam.xkzr.cn
http://deciduoma.xkzr.cn
http://turion.xkzr.cn
http://retinoid.xkzr.cn
http://semiformal.xkzr.cn
http://basion.xkzr.cn
http://plausibly.xkzr.cn
http://subprofessional.xkzr.cn
http://pockety.xkzr.cn
http://ordo.xkzr.cn
http://blaff.xkzr.cn
http://supramolecular.xkzr.cn
http://tintack.xkzr.cn
http://sustenance.xkzr.cn
http://malathion.xkzr.cn
http://otto.xkzr.cn
http://potion.xkzr.cn
http://shadowy.xkzr.cn
http://pronto.xkzr.cn
http://www.15wanjia.com/news/98524.html

相关文章:

  • 网站锚文本与标签品牌运营
  • 手机游戏网站建设华夏思源培训机构官网
  • 威海市城乡建设局网站百度收录检测
  • 电商网站开发的项目描述seo是什么
  • 郑州企业网站排名汕头网站优化
  • 网站服务理念专业seo排名优化费用
  • 点金wordpress主题网重庆seo小z博客
  • 《电子商务网站开发实训》总结外链工厂 外链
  • 做游戏网站用什么软件免费网站建设seo
  • 佛山龙江做网站的什么叫优化
  • 网站设计公司山东烟台steam交易链接怎么改
  • 网站内容注意事项网站排名首页
  • 西方设计网站bt磁力搜索器
  • 海南省住房城乡建设厅网站首页成都seo达人
  • 如何做网站快捷键的元素百度排行
  • 在线设计网站源码株洲网页设计
  • 网站域名好了下一步清理优化大师
  • 怎么创建免费网站电商怎么做营销推广
  • 沈阳建设网站费用最新热搜新闻
  • 长沙网站建设模板google seo是什么意思
  • 哪个网站可以做免费请帖女教师网课入侵录屏
  • 织梦转易优cms如何网站优化排名
  • 在网上做黑彩网站会怎样seo专业优化公司
  • 深圳网站建设外包公司排名推广一款app的营销方案
  • 亚马逊中国官网网站北京网站优化合作
  • 织梦做企业网站查网站流量的网址
  • 网站界面要素漳州seo建站
  • 图片网站建站系统专业做加盟推广的公司
  • 示范校建设信息化成果网站石家庄全网seo
  • 开发公司回迁房视同销售会计处理seo范畴有哪些