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

网站建设公司经营购物网站有哪些功能

网站建设公司经营,购物网站有哪些功能,网站资源建设方案,凉山住房和城乡建设局网站前言 本章就是我们C中类与对象的终章了#xff0c;不过本章的难度不大#xff0c;都是类中一些边边角角的知识#xff0c;记忆理解就行了#xff0c;相信经过这么长时间的学习类与对象#xff0c;你对面向对象也有了更加深的理解#xff0c;最后我们学习完边边角角的一些…前言 本章就是我们C中类与对象的终章了不过本章的难度不大都是类中一些边边角角的知识记忆理解就行了相信经过这么长时间的学习类与对象你对面向对象也有了更加深的理解最后我们学习完边边角角的一些知识点后我们再来一起谈谈类与对象的理解。 类与对象 四一、 再谈构造函数1、 初始化列表a.定义b.特性①每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)②类中包含以下成员必须放在初始化列表位置进行初始化③成员变量在类中声明次序就是其在初始化列表中的初始化顺序与其在初始化列表中的先后次序无关2. explicit关键字二、 static成员1、定义2、特性3、练习三、 友元1、介绍2、友元函数a.特性3、友元类a.特性四、 内部类1、定义2、特性五、匿名对象1、定义2、特性六、拷贝对象时的一些编译器优化七、 再次理解类和对象一、 再谈构造函数 虽然在类与对象二中我们已经详细介绍了构造函数但是我们在这里还是要继续谈论构造函数因为构造函数实在是太复杂了C之父最开始没有设计好后面又多次打补丁导致构造函数相当复杂不过这次再谈论构造函数并没有像以前的那么难我们这次谈论的是构造函数的一些碎片化知识。 我们还是先看代码再思考 #includeiostream using namespace std; class Date { public:Date(int year10, int month10, int day10){_year year;_month month;_day day;_a 10; //编译失败const修饰的变量不能改变} private:int _year;int _month;int _day;const int _a;//编译失败const 变量未初始化 };在创建对象时编译器通过调用构造函数给对象中各个成员变量一个合适的初始值虽然上述构造函数调用之后对象中已经有了一个初始值但是不能将其称为对对象中成员变量的初始化构造函数体中的语句只能将其称为赋初值而不能称作初始化。因为初始化只能初始化一次而构造函数体内可以多次赋值。 你可能觉得这样抠细节是不是有些太钻牛角尖了其实不是那样的有些变量非常看重初始化如const 修饰的变量只能初始化一次并且不能被赋值这就要求我们必须仔细分清初始化与赋值。 我们对上面代码的成员变量加一个const修饰的变量看看会发生什么 我们发现编译失败难到类里面不能定义这种const修饰的变量吗不是的其实我们可以按照类与对象二中讲的缺省值给const变量赋值但是缺省值是C更新之后才出现的那C更新之前版本我们C又是怎么解决的呢 答案就是初始化列表 1、 初始化列表 首先我们先思考一个问题对象定义时对象中的成员是具体在哪里定义的呢解决了这个问题上面的const修饰的变量不能定义的问题也就解决了因为const修饰的变量在定义时必须初始化即定义与初始化在一起。 答案是对象中的成员是具体定义是在初始化列表那么下面就让我们一起了解一下初始化列表吧 a.定义 初始化列表以一个冒号开始接着是一个以逗号分隔的数据成员列表每个成员变量后面跟一个放在括号中的初始值或表达式。 实例代码 #includeiostream using namespace std; class Date { public:Date(int year , int month , int day):_year(year)//初始化列表也是成员变量定义的地方这里才是真正的初始化,_month(month),_day(day),_a(10){} private:int _year;int _month;int _day;const int _a; }; int main() {Date d1(10,10,10);return 0; }b.特性 ①每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) ②类中包含以下成员必须放在初始化列表位置进行初始化 引用成员变量 定义时必须初始化const成员变量 定义时必须初始化自定义类型成员且该类没有默认构造函数时没有默认构造意味这初始化时必须传参 我们先看自定义类型成员且该类没有默认构造函数时我们不在初始化列表进行初始化 2.我们看自定义类型成员且该类有默认构造函数时我们不在初始化列表进行初始化。 结论是在初始化列表如果我们什么都不写编译器对内置类型不作处理对自定义类型去调用它的默认构造。 建议尽量使用初始化列表初始化因为不管你是否使用初始化列表对于自定义类型成员变量一定会先使用初始化列表初始化。 ③成员变量在类中声明次序就是其在初始化列表中的初始化顺序与其在初始化列表中的先后次序无关 思考以下代码的结果 #includeiostream 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 aa(1);aa.Print(); }可能结果让你大吃一惊我们仔细分析一下 2. explicit关键字 构造函数不仅可以构造与初始化对象对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数还具有类型转换的作用。 注意根据定义知这里的构造函数必须传参 我们看下面一段代码 #includeiostream using namespace std; class A { public:A(int a):_a1(a), _a2(_a1){} private:int _a1;int _a2; }; int main() {A aa1(1); A aa2 1;//这里不是拷贝构造拷贝构造是用一个对象初始化一个对象//这里也不是赋值重载赋值重载是用一个已经初始化的对象赋值给另一个已经初始化过的对象//是否可以编译通过return 0; }答案是可以编译通过并且通过监视我们可以看到它的值 那为什么这里能够通过编译呢答案是隐式类型转化 我们在讲解引用时曾经讲过之所以下面的代码能通过是因为 i 会隐式类型转换为一个double类型的临时变量且临时变量具有常性d 引用的就是这个double类型的临时变量 int i 10; const doubled i;同理这里也是具体过程如下 明白了单参数的类型转化赋值的原理后我们看看多个参数怎么做 #includeiostream using namespace std; class A { public:A(int a,int b):_a1(a), _a2(b){} private:int _a1;int _a2; }; int main() {A aa1(1,2); //调用构造函数A aa2 {1,2}; //多个参数类型转化return 0; }这里我们可以看到多个参数是我们是用{ }来给值的 注意单个参数转换是C98支持的多个参数转化是C11支持的 但是有时候我们却不想让这种事情发生这是就需要我们用explicit修饰构造函数将会禁止构造函数的隐式转换。 同样的代码我们加上explicit 到这里我们总算是将构造函数讲完了…之后还要多多复习啊 二、 static成员 1、定义 声明为static的类成员称为类的静态成员用static修饰的成员变量称之为静态成员变量用static修饰的成员函数称之为静态成员函数。 静态成员变量一定要在类外进行初始化因为初始化列表只能初始化非静态成员 实例代码 #includeiostream using namespace std; class A { public:A():_a(10),_b(a){} private:int _a;char _b;static int c;//这里不能给缺省值缺省值是给初始化列表使用的//初始化列表只能初始化非静态成员 }; int A::c 10; int main() {A aa;return 0; }2、特性 静态成员为所有类对象所共享不属于某个具体的对象存放在静态区静态成员变量必须在类外定义定义时不添加static关键字类中只是声明类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问静态成员也是类的成员受public、protected、private 访问限定符的限制静态成员函数没有隐藏的this指针不能访问任何非静态成员 3、练习 讲到这里我们来看一道面试题 请实现一个类计算程序中创建出了多少个类对象。 我们首先分析问题要统计创建了多少个类对象我们就要看类对象的统一特性我们知道所有创建出来的对象都要经过构造函数拷贝构造也是构造函数的重载)所以我们只需要定义一个静态成员的统计变量注意特性1静态成员为所有类对象所共享不属于某个具体的对象每次创建了对象我们就让这个静态统计变量加一就好了 实例代码 #includeiostream using std::cout; using std::endl; class A { public:A():_a(10){_count;}A(const A tmp){_a tmp._a;_count;} private:static int _count;int _a; }; int A::_count 0; int main() {A aa1;A aa2;A aa3(aa1);A aa4(aa2);return 0; }我们再来思考两个问题 静态成员函数可以调用非静态成员函数吗 答案是不能静态成员函数没有this指针调用非静态成员函数需要传递this指针静态成员函数无法为非静态成员函数传递this指针因此不能调用。非静态成员函数可以调用类的静态成员函数吗 答案是可以非静态成员函数有this指针调用静态成员函数不需要传递this指针非静态成员函数可以为静态成员函数传递this指针因此能够调用。 三、 友元 我们知道想要在类外访问类中的私有成员一般是做不到的但是当我们想要在类外访问类中的私有成员时我们便需要一些特殊手段了如友元 1、介绍 友元提供了一种突破封装的方式有时提供了便利。但是友元会增加耦合度破坏了封装所以友元不宜多用。 友元分为友元函数和友元类 2、友元函数 友元函数可以直接访问类的私有成员它是定义在类外部的普通函数不属于任何类但需要在类的内部声明声明时需要加friend关键字。 #includeiostream using namespace std; class Date {friend ostream operator(ostream _cout, const Date d);//友元函数的声明friend istream operator(istream _cin, Date d);//友元函数的声明 public:Date(int year 1900, int month 1, int day 1): _year(year), _month(month), _day(day){} private:int _year;int _month;int _day; }; //运算符重载 ostream operator(ostream _cout, const Date d) {_cout d._year - d._month - d._day;//不使用友元函数无法访问这里的成员变量。return _cout; } istream operator(istream _cin, Date d) {_cin d._year; //不使用友元函数无法访问这里的成员变量。_cin d._month; //不使用友元函数无法访问这里的成员变量。_cin d._day; //不使用友元函数无法访问这里的成员变量。return _cin; } int main() {Date d;cin d;cout d endl;return 0; }a.特性 ①友元函数可访问类的私有和保护成员但不是类的成员函数 ②友元函数不能用const修饰友元函数没有this指针 ③友元函数可以在类定义的任何地方声明不受类访问限定符限制 ④一个函数可以是多个类的友元函数 ⑤友元函数的调用与普通函数的调用原理相同 3、友元类 友元类的所有成员函数都可以是另一个类的友元函数都可以访问另一个类中的非公有成员。 a.特性 友元关系是单向的不具有交换性。 比如下面的Time类和Date类在Time类中声明Date类为其友元类那么可以在Date类中直接访问Time类的私有成员变量但想在Time类中访问Date类中私有的成员变量则不行。友元关系不能传递 如果C是B的友元 B是A的友元则不能说明C时A的友元。友元关系不能继承。 //友元类 class Time {friend class Date; // 声明日期类为时间类的友元类则在日期类中就直接访问Time类中的私有成员变量 public:Time(int hour 0, int minute 0, int second 0): _hour(hour), _minute(minute), _second(second){} private:int _hour;int _minute;int _second; }; class Date { public:Date(int year 1900, int month 1, int day 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){// 直接访问时间类私有的成员变量_t._hour hour;_t._minute minute;_t._second second;} private:int _year;int _month;int _day;Time _t; };四、 内部类 1、定义 概念如果一个类定义在另一个类的内部这个内部类就叫做内部类。内部类是一个独立的类它不属于外部类更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。 注意内部类就是外部类的友元类参见友元类的定义内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。 2、特性 内部类可以定义在外部类的public、protected、private都是可以的并且受到访问限定符的影响。注意内部类可以直接访问外部类中的static成员不需要外部类的对象/类名。sizeof(外部类)外部类和内部类没有任何关系。 实例代码 //内部类 #includeiostream using namespace std; class A { private:static int k;int h; public:class B // B天生就是A的友元{public:void foo(const A a){cout k endl;//OKcout a.h endl;//OK}}; }; int A::k 1; int main() {A::B b;b.foo(A());return 0; }五、匿名对象 1、定义 匿名对象就是指我们定义一个对象但是它没有名字C语言里面也有匿名结构体匿名对象的使用场景通常是临时需要一个变量但又不太想让它发挥很大的作用。 定义的格式 类名() //例如 A是一个类 A();//定义一个匿名对象2、特性 匿名对象的生命周期只有它所在的那一行那下一行过后它就会自动调用析构函数。 //匿名对象 #includeiostream using namespace std; class A { public:A(int a 0):_a(a){cout A(int a) endl;}~A(){cout ~A() endl;} private:int _a; }; class Solution { public:int Sum_Solution(int n) {//...return n;} }; int main() {A aa1;// 不能这么定义对象因为编译器无法识别下面是一个函数声明还是对象定义//A aa1();// 但是我们可以这么定义匿名对象匿名对象的特点不用取名字// 但是他的生命周期只有这一行我们可以看到下一行他就会自动调用析构函数A();A aa2(2);// 匿名对象在这样场景下就很好用如果不定义匿名对象我们就要创建一个Solution这样的对象。Solution().Sum_Solution(10);return 0; }六、拷贝对象时的一些编译器优化 随着编译器的发展迭代现在的编译器已经非常智能了一般在一些不算太老的编译器上编译器在传参和传返回值的过程中一般编译器会做一些优化减少对象的拷贝这个在一些场景下还是非常有用的。 下面我们一起来看一下吧 //拷贝对象时的一些编译器优化 #includeiostream using namespace std; class A { public:A(int a 0):_a(a){cout A(int a) endl;}A(const A aa):_a(aa._a){cout A(const A aa) endl;}A operator(const A aa){cout A operator(const A aa) endl;if (this ! aa){_a aa._a;}return *this;}~A(){cout ~A() endl;}private:int _a; };void f1(A aa) {} A f2() {A aa;return aa; } A f3() {return A(); }int main() {// 传值传参 不优化A aa1; f1(aa1);cout ---------------------------------------------------- endl;// 传值返回f2(); //不优化 调用一个构造函数一个拷贝构造 因为是两行代码编译器不敢擅自优化cout ---------------------------------------------------- endl;// 隐式类型构造拷贝构造-优化为直接构造f1(1);// 一个表达式中构造连续拷贝构造-优化为一个构造f1(A(2));cout ---------------------------------------------------- endl;// 一个表达式中连续拷贝构造拷贝构造-优化一个拷贝构造A aa2 f2();cout ---------------------------------------------------- endl;// 一个表达式中连续拷贝构造赋值重载-无法优化aa1 f2();cout ---------------------------------------------------- endl;f3(); //一行中构造拷贝构造 -优化为一个构造A aa3 f3(); //一行中构造拷贝构造拷贝构造 -优化为一个构造return 0; }七、 再次理解类和对象 现实生活中的实体计算机并不认识计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体用户必须通过某种面向对象的语言对实体进行描述然后通过编写程序创建对象后计算机才可以认识。比如想要让计算机认识洗衣机就需要 用户先要对现实中洗衣机实体进行抽象—即在人为思想层面对洗衣机进行认识洗衣机有什么属性有那些功能即对洗衣机进行抽象认知的一个过程经过1之后在人的头脑中已经对洗衣机有了一个清醒的认识只不过此时计算机还不清楚想要让计算机识别人想象中的洗衣机就需要人通过某种面相对象的语言(比如C、Java、Python等)将洗衣机用类来进行描述并输入到计算机中经过2之后在计算机中就有了一个洗衣机类但是洗衣机类只是站在计算机的角度对洗衣机对象进行描述的通过洗衣机类可以实例化出一个个具体的洗衣机对象此时计算机才能洗衣机是什么东西。用户就可以借助计算机中洗衣机对象来模拟现实中的洗衣机实体了。 在类和对象阶段大家一定要体会到类是对某一类实体(对象)来进行描述的描述该对象具有那些属性那些方法描述完成后就形成了一种新的自定义类型才用该自定义类型就可以实例化具体的对象。
http://www.hkea.cn/news/14388251/

相关文章:

  • 手机版网站开发教学北京公司网站设计电话
  • 全国网站联盟建设公司经营范围
  • 织梦网站迁移上海金山区建设局网站
  • 河北高阳做网站的做技术支持的网站有
  • 河北衡水建设网站公司电话绍兴网站建设推广
  • 政务网站建设及安全刚刚刚刚刚刚好痛
  • 移动网站开发内容php 电子商务网站建设
  • 中职网站建设西安网站策划设计
  • 北京电信备案网站wordpress postmeta表
  • 做鲜花配送网站需要准备什么内网网站建设软件
  • 哔哩哔哩官方网站首页东阳建设公司网站
  • 黄金路网站建设公司查询网站后台地址
  • 大学生创业服务网站建设方案项目书短视频素材网站免费大推荐
  • 无锡网站的优化哪家好珠宝手机网站模板
  • 宣传网站设计有什么网络项目可以做的
  • 南通模板建站多少钱七零三八零四温州论坛
  • 门户网站视频买服饰网站建设
  • 织梦网站如何播放mp4律师事务所网站建设方案
  • 建站之星怎么收费大型网站建设需要
  • 禅城网站建设代理学习网页设计
  • 用电脑做兼职的网站比较好博客网站制作
  • 朝阳企业网站建设方案数据库 搭建 网站
  • 做网站已经不行wordpress整合ck
  • 顺德网站建设公司网络的推广方式有哪些
  • 鲜花销售网站模板seo外链工具下载
  • 手机网站开发程序员为shopify做推广的网站
  • 资料库网站源码网站建设店铺
  • 果麦传媒的网站怎么做的商城网站建设多少钱
  • 站内推广的方式有哪些开发小程序哪家好
  • 在招聘网站做电话销售怎么样网站建设前期策划方案