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

网站怎么做才美观拓客软件

网站怎么做才美观,拓客软件,做盗版电影网站犯法吗,wordpress更新机制文章目录10 类和对象10.1 封装10.1.1 封装的意义10.1.2 struct和class的区别10.1.3 成员属性设置为私有10.2 对象的初始化和清理10.2.1 构造函数和析构函数10.2.2 构造函数的分类及调用10.2.3 关于拷贝构造函数调用时机10.2.4 构造函数调用规则10.2.5 深拷贝和浅拷贝10.2.6 初始… 文章目录10 类和对象10.1 封装10.1.1 封装的意义10.1.2 struct和class的区别10.1.3 成员属性设置为私有10.2 对象的初始化和清理10.2.1 构造函数和析构函数10.2.2 构造函数的分类及调用10.2.3 关于拷贝构造函数调用时机10.2.4 构造函数调用规则10.2.5 深拷贝和浅拷贝10.2.6 初始化列表10.2.7 对象成员10 类和对象 C面向对象的三大特性封装、继承、多态 C认为万事万物皆为对象对象上有其属性和行为 例如 人可以作为对象属性有姓名、年龄、身高、体重。。。行为有走、跑、跳、吃饭、唱歌。。。 具有相同性质的对象我们可以抽象为类人属于人类车属于车类。 10.1 封装 10.1.1 封装的意义 封装封装是C面向对象三大特性之一其将属性和行为作为一个整体表现生活中的事物并可以将属性和行为加以权限控制 封装意义一在设计类的时候属性和行为写在一起表现事物 语法class 类名{访问权限属性/行为}; 示例1设计一个圆类 #include iostream using namespace std;//圆周率 const double PI 3.14;//设计一个圆类求圆的周长 //圆求周长的公式2*PI*半径//class 代表设计一个类类后面紧跟着的就是类的名称 class Circle { public://属性半径int m_r;//行为:获取圆的周长double calculateZC(){return 2 * PI * m_r;} };int main() {//通过这个圆类创建具体的圆(对象)Circle c1;//给圆对象的属性进行赋值c1.m_r 10;cout 圆的周长为 c1.calculateZC() endl;system(pause);return 0; }结果圆的周长为62.8 示例二设计一个学生类属性有姓名和学号可以给姓名和学号赋值可以显示学生的姓名和学号 #include iostream #include string using namespace std;//设计学生类 class Student { public://公共权限//属性string m_Name;//姓名int m_Id;//学号//行为void showStudent(){cout 姓名 m_Name 学号 m_Id endl;} };int main() {//实例化Student s1;s1.m_Name 张三;s1.m_Id 1;s1.showStudent();system(pause);return 0; }结果姓名张三学号1 对于上面的代码可以改进一下 #include iostream #include string using namespace std;//设计学生类 class Student { public://公共权限//属性string m_Name;//姓名int m_Id;//学号//行为void showStudent(){cout 姓名 m_Name 学号 m_Id endl;}void setName(string name){m_Name name;}void setId(int id){m_Id id;} };int main() {//实例化Student s1;s1.setName(张三);s1.setId(1);s1.showStudent();system(pause);return 0; }封装意义二类在设计时可以把属性和行为放在不同的权限下加以控制 访问权限有三种 英文名中文名说明public公共成员类内可以访问、类外也可访问protected保护成员类内可以访问、类外不可访问但是在继承时protected的内容可以被子类访问private私有权限成员类内可以访问、类外不可访问但是在继承时private的内容不可以被子类访问10.1.2 struct和class的区别 在C中和struct和class唯一的区别就在于默认的访问权限不同对于struct来说其默认权限为公共而对于class来说其默认权限为私有。 10.1.3 成员属性设置为私有 这块知识就和java中的封装对应上了在java中我们时常用private对类中的成员属性进行私有化然后用set去写入用get去读。 在C中我们同样的将所有成员属性设置为私有这样的好处是可以自己控制读写权限并且在写入数据的过程中我们还可以用函数来控制其写入数据的有效性。 如果想体验这个知识点可以试着做一下下面的案例 #include iostream #include string using namespace std;//设计人类 class Person { private://姓名string m_Name;//年龄int m_Age;public:void setName(string name){m_Name name;}void setAge(int age){m_Age 0;if(age0 age 200)m_Age age;}string getName(){return m_Name;}int getAge(){return m_Age;} };int main() {Person p1;p1.setName(张三);p1.setAge(-1);cout p1.getName() endl;cout p1.getAge() endl; }结果张三 0 10.2 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置在某一天我们不用时候也会删除一些自己信息数据保证安全而对于C来说C的面向对象编程也是来源于生活所以每个对象都会有初始设置以及对象销毁前的清理数据的设置。 10.2.1 构造函数和析构函数 C利用了构造函数和析构函数解决上面说的初始化和销毁化问题这两个函数将会被编译器自动调用完成对象初始化和清理工作。对象的初始化和清理工作是编译器强制要我们做的事。因此如果我们不提供构造和析构编译器会提供编译器提供的构造函数和析构函数。并且两个都是是空实现。 和java实际上很类似java中也存在构造函数但是没有析构函数java如果没有构造方法那么其自带一个无参构造如果写了构造方法那么系统原有自带的无参构造会消失这也意味着我们写完有参构造后还要再写一个无参构造。 java没有析构函数的原因是其运行在JVM上当对象消失那么JVM会启用垃圾回收机制回收分配给对象的资源而C不会自动回收因此当对象消失时需要提供析构函数来回收资源。 构造函数语法为类名(){}需要注意的是C中的构造函数没有返回值也不用写void构造名称和类名相同。构造函数可以有参数所以可以发生重载即可以同时拥有空参构造方法和有参构造方法。程序在调用对象的时候会自动调用构造无需手动调用而且只会调用一次。 对于析构函数来说其语法为~类名(){}需要注意的是析构函数同构造函数的特点基本一样有一点不一样的是析构函数不可以有参数因此不能写多个析构函数。 在visual studio中如果你用了系统提示的class创建那么他会帮你把构造和析构全部写好如果要写多余的构造自己补充即可。 10.2.2 构造函数的分类及调用 两种分类方式 按参数分按类型分有参构造普通构造无参构造默认构造拷贝构造 三种调用方式 括号法显示法隐式转换法 拷贝构造 除了拷贝构造之外其他的都是普通构造。在学习其他编程语言的过程中我们并没有听过拷贝构造其是C中特有的一种构造方法通过类名 (const 类名 对象名){拷贝内容}即可定义拷贝构造拷贝构造常用语将某一个对象的属性拷贝给另外一个对象。 括号法 括号法很简单但是学过java的同学可能会混什么意思呢。 如果是调用无参构造那么只需类名 对象名系统会自动调用而在java中我们通常是类名 对象名 new 构造器()也就是说即使是无参我们也会把括号写上而在C中调用无参构造时不能写括号因为写了括号C会误以为你是写了一个函数的声明。 如果是有参构造只需要类名 对象名(参数)即可。 如果是拷贝构造只需要类名 对象名(被拷贝的对象)。 显式法 如果不用括号法可以用显式法来调用构造函数从形式上看显式法更像java的构造调用。 对于无参构造显式法和括号法一样。 对于有参构造显式法格式为类名 对象名 类名(参数) 对于拷贝构造显式法格式为类名 对象名 类名(被拷贝的对象)。 需要注意的是类名(参数)类似于java学习中的匿名内部类在C中被我们称为匿名对象其特点是当前行执行结束后系统会立即回收掉匿名对象。 还有一点是不要利用拷贝函数来初始化一个匿名对象如类名(对象名)如果你尝试这么做编译器会认为其等价于类名 对象名即对象的声明。 隐式转换法 隐式转换法实际上是显式法的简略版但是你说简略实际上它还没括号法简略呢所以不想了解也没啥问题虽然别人写的代码你可能看不懂哈哈。 对于有参构造隐式转换法格式为类名 对象名 参数。对于拷贝构造也是同样的原理。 10.2.3 关于拷贝构造函数调用时机 C中需要拷贝构造函数的情况通常有三种 使用一个已经吃那完毕的对象来初始化一个新对象值传递的方式给函数参数传值以值的方式返回局部对象 示例 #includeiostream using namespace std;class Person { public:int m_Age;Person(){cout Person默认构造函数调用 endl;}Person(int age){cout Person有参构造函数调用 endl;m_Age age;}Person(const Person p){cout Person拷贝构造函数调用 endl;m_Age p.m_Age;}~Person() {cout Person默认析构函数调用 endl;}};//构造拷贝函数调用时机 //1、使用一个已经创建完毕的对象来初始化一个新对象 void test01() {Person p1(20);Person p2(p1);cout p2的年龄为 p2.m_Age endl; }//2、值传递的方式给函数参数传值 void doWork(Person p) {}void test02() {Person p;doWork(p); }//3、值方式返回局部对象 Person doWork2() {Person p1;return p1; }void test03() {Person p doWork2(); }int main() {//test01();//test02();test03(); }10.2.4 构造函数调用规则 默认情况下C编译器至少给一个类添加三个函数 默认构造函数无参函数体为空默认析构函数无参函数体为空默认拷贝构造函数对所有属性值进行拷贝 构造函数调用规则如下 如果用户定义有参构造函数C将不在提供无参构造但是会提供默认拷贝构造如果用户定义拷贝构造函数C将不会提供其他构造函数 乍一看上面的规则似乎和Java中的很类似。 如果想要了解上述的知识点我们可以手动做一下下列的案例 #includeiostream using namespace std;//构造函数的调用规则 /*- 默认构造函数无参函数体为空 - 默认析构函数无参函数体为空 - 默认拷贝构造函数对所有属性值进行拷贝*/class Person { public:int m_Age;Person() {cout Person的默认构造函数调用 endl;}Person(int age) {cout Person的有参构造函数调用 endl;}/*person(const person p) {cout person的拷贝构造函数调用 endl;m_age p.m_age;}*/~Person() {cout Person的默认析构函数调用 endl;} };void test01() {Person p;p.m_Age 18;Person p2(p);cout p2的年龄为 p2.m_Age endl; }int main() {test01(); }10.2.5 深拷贝和浅拷贝 浅拷贝简单的赋值拷贝操作 深拷贝在堆区重新生成空间然后再进行拷贝 深浅拷贝是面试最常见的问题需要严加重视。 我们现在来思考一个问题如果我们想要利用拷贝构造函数在堆区生成一块空间怎么办一般思路应该如下 #include iostream using namespace std;class Person { public:int m_Age;int* m_Height;Person() {cout Person的默认构造函数被调用 endl;}Person(int age, int height) {cout Person的有参构造函数调用 endl;m_Age age;m_Height new int(height);}~Person(){if (m_Height ! NULL){delete(m_Height);m_Height NULL;}cout Person的析构函数调用;}private:};void Test01() {Person p1(18160);cout p1的年龄为 p1.m_Age endl;Person p2(p1);cout p2的年龄为 p2.m_Age endl; }int main() {Test01(); } 经过上面的代码敲试你会发现这段代码是会报错的。因为这里出现了一个问题——重复释放内存。 我们知道上述代码的p2是由p1拷贝而来在执行析构函数时p2的代码写于p1之后而析构函数位于栈空间那么根据栈后入先出的特点则p2应该首先执行析构函数。 在你没有编写拷贝构造函数时系统会默认给出一个拷贝构造函数这个拷贝构造函数执行的是一个浅拷贝的过程相当于我们平时说的值传递它的作用是赋值p1对象里所有的值给p2。 当我们执行上面的代码时p1的析构也给了p2p1中的m_Height作为在堆区开辟的数据p2从p1拷贝了m_Height的指针也就是说P2.m_Height和P1.m_Height共享这个指针。当p2先执行析构该指针就被释放掉而轮到p1执行析构时没有指针可释放所以就报错了。编译器写的浅拷贝构造函数如下 Person(const Person p) {coutPerson 拷贝构造函数调用endl;m_Age p.m_Age;m_Height p.m_Height; }既然弄明白了上述的问题我们要做的实际上就是要再开辟一块堆区空间使得p2和p1的m_Height空间不一样。如下所示 #include iostream using namespace std;class Person { public:int m_Age;int* m_Height;Person() {cout Person的默认构造函数被调用 endl;}Person(int age, int height) {cout Person的有参构造函数调用 endl;m_Age age;m_Height new int(height);}~Person(){if (m_Height ! NULL){delete(m_Height);m_Height NULL;}cout Person的析构函数调用;}Person(const Person p) {cout Person 拷贝构造函数调用 endl;m_Age p.m_Age;//深拷贝m_Height new int(*p.m_Height);}private:};void Test01() {Person p1(18,160);cout p1的年龄为 p1.m_Age endl;cout p1的身高为 p1.m_Height endl;Person p2(p1);cout p2的年龄为 p2.m_Age endl;cout p2的身高为 p2.m_Height endl; }int main() {Test01(); }10.2.6 初始化列表 我们知道构造函数实际上就是用于初始化对象C提供了初始化列表语法用于初始化对象中的属性。其语法如下所示 构造函数():属性1(值1),属性2(值2)… #include iostream using namespace std;//初始化列表 class Person { public:int m_A;int m_B;int m_C;//传统初始化方法/*Person(int a, int b, int c){m_A a;m_B b;m_C c;};*///初始化列表/*Person() :m_A(10), m_B(20), m_C(30) {}*///初始化列表Person(int a, int b, int c) :m_A(a), m_B(b), m_C(c) {} };void test01() {//Person p(10, 20, 30);Person p(10,20,30);cout m_A p.m_A endl;cout m_B p.m_B endl;cout m_C p.m_C endl; }int main() {test01(); }10.2.7 对象成员 C类中的成员可以是另一个类的对象我们称该成员为对象成员。 如 class A{} class B {A a }由此引发一个问题当创建B对象时A和B的构造和析构的顺序谁先谁后。 #include iostream using namespace std; #include stringclass Phone { public://手机品牌名称string m_PName;Phone(string pName) {m_PName pName;};private:};class Person { public://姓名string m_Name;//手机Phone m_Phone;Person(string name, string pName) :m_Name(name), m_Phone(pName) {}private:};void test01() {Person p(张三, 苹果X);cout p.m_Name 拿着 p.m_Phone.m_PName endl; }int main() {test01(); } 执行以上的代码我们可以看出实际上对象成员是先构造的而后类对象再构造而对于析构来说类对象先析构而后是对象成员。这就好比搭积木你要搭个人出来肯定要先搭好胳膊和腿同理如果你要拆积木也肯定是先拆胳膊和腿。
http://www.zqtcl.cn/news/910444/

相关文章:

  • 长沙网站制作公司地址农业推广作业
  • 网站创意设计公司定制网站开发价格
  • 专业网站建设加盟合作怀化seo快速排名
  • 房山区网站建设wordpress自动采集翻译插件怎么用
  • 郴州做网站 郴网互联网站制作公司起名
  • 织梦做的的网站首页显示空白查企业营业执照的网站
  • 葫芦岛公司做网站外贸西班牙语网站建设
  • 广西住房和城乡建设厅培训中心网站首页wordpress建导航
  • 企业建立网站需要提供什么建立网站需要多长钱
  • 科技企业网站源码下载网页设计公司哪家效果好
  • 成都龙泉工程建设有限公司网站网络科技有限公司网站建设策划书
  • 温州网站建设对比赣州招聘网最新招聘
  • 网站建设什么时候好商丘创小资网络有限公司
  • 做网站不切片可以吗wordpress导入表单
  • 广告公司的网站建设价格wordpress简洁淘宝客免费主题
  • 内蒙古建设安全监督站的网站做网站排名多少钱
  • 自学网站平面设计友链大全
  • go语言做的网站哪个公司搭建网站
  • 网站地图抓取正邦设计创始人
  • 济南建网站公司佛山做营销型网站建设
  • 网站总体策划的内容有哪些做网站排名seo
  • 网站备案上传照片几寸上海网站排名提升
  • 重庆cms建站系统丰都网站建设联系电话
  • 网络教学平台昆明理工大学优化大师的功能有哪些
  • 个人主题网站做的步骤一流的网站建设
  • 公司网站建设规划国外搜索关键词的网站
  • 石家庄网站快速优化排名国内做性视频网站有哪些
  • 易居做网站网页设计的发展
  • 开一个网站建设公司好产品销售型的网站
  • 苍梧县网站建设南京网站建设 雷仁网络