C++ 学习笔记----类篇

 

(一)基本概念:

1、类与对象:

1 //声明类
2 class Human {
3 
4        //... Data members and methods go here
5 
6 };
7 
8 //定义对象
9 Human human;  

 

2、通常用class声明类,struct也可以,只不过在信息隐藏机制上有点区别;struct默认是public,而class默认是private;只能在类的成员函数或friend函数中访问类的非公有成员;

3、成员选择符:' . ' 和 ' -> ';

4、成员函数的定义:

  两种方式:一种在类内定义,所定义的成员函数都是inline类型的;一种是在类外定义;在类外定义时,要使用 ‘::’ 域解析符,在类外定义成员函数,如果声明时,使用inline关键字,可使在类外定义的成员函数强制变成内联函数

 1 class Person {
 2 
 3       public :
 4              void setAge( unsigned n );
 5              unsigned getAge() const;
 6       private :
 7              unsigned age;
 8 
 9 };
10 
11 //define class method;
12 
13 void Person::setAge( unsigned n ){
14        age = n;
15 }
16 unsigned Person::getAge(){
17        return age;
18 }

 

5、效率和健壮性:

(1)通过引用来传递和返回对象:

  一般来说,对对象的传递和返回应该使用“引用”,因为这样可以提高效率;

  注意:在返回引用类型的对象时,如果是在类内定义的对象,要加上static修饰,否则这个对象对其他函数时不可见的;

1 C& get(){
2 
3       static C c1;  //注意static修饰符;
4       c1.set(123);
5       return C1;
6 
7 }

 

(2)const类型参数的对象引用:

 1 class C{
 2 
 3       public:
 4           void setName(const string& n){  name = n;  } 
 5           //通过const的修饰,setName()不会修改n的值;
 6           //... other public members;
 7  
 8       priavte:
 9           string name;
10 
11 };

 

(3)const成员函数:

  如果一个成员函数不会直接或间接地改变该函数所属对象的任何数据成员,最好把这个成员函数标记为const;称这样的成员函数为只读函数;它只能调用其他的const成员函数;

  例如:int get() const {   return num ;   }

 1 //下面展示const的三种用法:
 2 
 3 class C {
 4 
 5       public :
 6             //set()中的const表明它不会修改参数n的值;
 7             void set (const string& n) {  name = n ; }
 8             //前面的const表明谁也不能通过这个引用来修改name的值;
 9             //第二个const表明get()不会修改name的值;
10             const string& get() const {   return name ;  }
11       private:
12             string name;
13 
14 };

 

 (二)构造函数与析构函数:

 

1、构造函数:主要用来对数据成员进行初始化,并负责在对象创建时需要处理的事务,对类的健壮性有着重要作用;

  特点:函数名与类名相同;没有返回类型;自动调用;可重载;行为与其他函数相同;可在类中定义,也可在声明之外定义;

  (1)约束对象的创建:

    如果定义了非默认的构造函数,而没有定义默认的构造函数,则系统不会提供默认的构造函数;

  (2)在类C的构造函数中错误的使用单一的C类型参数; 例如: class C {  public :  C (C obj);  } //红色标注的是错误的;

     在拷贝构造函数可以有一个C参数,但那是一个引用; 例如:class C {  public :  C (C& obj);  }   //红色标注的是正确的,因为它是一个拷贝构造函数;

 

2、拷贝构造函数:

  (1)在默认情况下,系统会自动生成一个拷贝构造函数,将源对象所有数据成员的值逐一赋值给目标对象相应的数据成员;

    两种原型:例如:Person( Person& );            Person( const Person& )

  (2)自定义拷贝构造函数:第一个以后的参数都必须有默认值;例如:

    Person( const Person& p , bool married = false  );

    当一个类包含指向动态存储空间指针类型的数据成员,则应为这个类设计拷贝构造函数;

    //应当举例说明:::::暂略

 

    通过自定义构造函数可禁止通过传值方式传递和返回类对象:因为传值需要拷贝,把拷贝构造函数设为私有,可禁止传值;

 1 class C {
 2 
 3       public :
 4            C();
 5       private:
 6            C( C& ); //把拷贝构造函数设为私有;
 7 
 8 };
 9 
10 void f( C ) { ... }  //Call by value
11 
12 C g() {  ...   }       //return by value
13 
14 int main()
15 {
16       C c1,c2;
17       f(c1);  //...Error,可改为  void f(C& obj) { ... }
18       c2 = g();   //....Error,可改为  C& g(){ ...  };
19 }

 

3、转型构造函数:只有一个参数,用于类型间的转换;例如,类C的转型构造函数可将其他类型的变量转型为类C类型的变量;

     注意关键字:explicit;

 

4、构造函数初始化程序:

 1 //在此程序中,对c进行赋值是非法的....
 2 class C {
 3      public :
 4           c() {
 5              x = 0;
 6              c = 0;   //Error . c is const
 7           }
 8      private:
 9           int x;
10           const int c;
11 };            

  应改为:这是初始化const成员变量的唯一方法;初始化列表仅在构造函数中有效;可初始化任何数据成员;

1 class C {
2       public :
3            C() : c( 0 ) {  x = 0; }
4       private :
5            int x;
6            const int c;    
7 };

 

5、构造函数与操作符new和new[]

  当使用动态方式为一个对象分配存储空间时,C++操作符new和new[]比函数malloc和calloc做的更好, 因为它们会调用相应的构造函数;

 

6、析构函数:

  发生在如下情况:一是以某个类作为数据类型的变量超出了其作用范围;一是用delete操作符删除动态分配的对象;

  例如:~C();    //不带参数,不能被重载;

 

7、构造函数与析构函数的调用顺序:

  构造函数:先调用父类的构造函数,然后才是子类的构造函数;

  析构函数:先调用子类的析构函数,然后才是父类的析构函数;

 

(三)类数据成员与类成员函数:

  

  1、使用  static  修饰, 属于整个类,可被某个对象调用,也可被类调用(被类调用时,使用 :: 操作符);修饰词一般只在声明时使用;例如:

1 class C{
2 
3     private :
4          static int x ;
5 
6 };
7 
8 int C :: x = 0;   //无需加static

 

  2、在成员函数内部定义static变量:

    该类的所有的对象在调用这个成员函数时,将共享这个变量;

 

(四)指向对象的指针(->):

  1、用途:一是作为参数传递给函数,或是通过函数返回,一是使用操作符new和new[]动态创建对象,然后返回一个指向该对象的指针;

 

  2、常量指针this:在成员函数内部可以用this来访问与成员函数的调用相关联的对象;

    例如:void setID (const string& id) {  this->id = id ;  } 

 

 

 

////
//C++学习笔记
////

转载于:https://www.cnblogs.com/china-victory/archive/2012/11/17/2774453.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ux和ui_设计社交餐厅策展应用程序— UX / UI案例研究

ux和uiSabor, which translates from “taste” or “flavor” in Spanish, is a concept for an iOS app designed to provide users with honest, reliable and relatable restaurant recommendations from friends and family. It is a social restaurant curation applicat…

你不知道的 script 标签的 defer 与 async 属性

我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建…

我是怎么调试 Element UI 源码的

我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试系列。另外:目前建…

java对象的理解

1、看生成几个对象,就看new了几次, Stu s1new Stu(“张三”); Stu s2s1;-这里也是生成了一个对象,只不过s1和s2指向了同一个对象 2、Stu s1new Stu(“张三”); Stu s2 new Stu(“李四”); s1s2;这里生成了两个对象,但是…

模板缓冲_模板缓冲以及如何使用它可视化体积相交

模板缓冲介绍 (Introduction) The trendy thing in real-time rendering these days is ray-tracing. However, traditional rasterization hasn’t disappeared, and it won’t in the near future. I recommend this blog post on the subject: A hybrid rendering pipeline …

重磅!哈啰 Quark Design 正式开源,下一代跨技术栈前端组件库

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试…

对lua协程的一点理解

读《Programming In Lua》协程那一章,比较困惑的还是procuer-consumer那个例子: function consumer(prod)while true dolocal x receive(prod)print(x)end endfunction receive(prod)local status, value coroutine.resume(prod)return value endfunct…

b端 ux 设计思维_借助系统思维从视觉设计过渡到UX

b端 ux 设计思维“How can I switch to UX?” This is a common question from visual designers because there’s a lot of overlap on the surface. But it can also be a difficult transition since UX encompasses much more below the surface.“如何切换到UX&#xff…

三面面试官:运行 npm run xxx 的时候发生了什么?

大家好,我是若川。近期发现好些小伙伴工作有2-3年了,基本不会写脚手架,或者说没学过脚手架。对脚手架大致是如何执行的基本不太知道。其实这类学习资料真的挺多的。而且我们基本天天 npm run dev,应该学习内部实现。不知道的小伙伴…

figma下载_Figma的自动版式实用

figma下载Figma’s Auto Layout has been around for a while, but not everyone’s aware of the benefits it brings. It doesn’t replace constraints, they’re still very much needed. The trick is to use the right feature where necessary. I want to show you how …

Qt通过ODBC读取excel文件

之前替学校考试科用C Builder做过一个小的数据库工具,处理excel表格用的,现在想转换到Qt平台下来,在网上搜了搜有一些利用OBDC读取xls文件的教程: http://hi.baidu.com/kxw102/item/770c496d5736470ca0cf0f1d http://blog.sina.co…

真 · 三面面试官:运行 npm run xxx 的时候发生了什么?

昨晚没权限我只放了链接,今天联系开了白名单。昨天推文主要是为了投票,表明 Node.js 的重要性,有人评论是水文。今天重新转载下。欢迎继续点此去投票。投票显示有高达近80% 表示不太会开发脚手架,看来大多数人确实没有应用场景。可…

ovo svm_反思我在OVO担任远程产品设计实习生的时间

ovo svmIn a quiet bedroom accompanied only by the low humming of my laptop fan, I sat before a Google Hangouts meeting, and got to know my colleagues for the first time, unaware of the joy of a ride that was waiting for me at OVO Design.在一个安静的卧室里&…

native的Socket向Android的LocalSocketServer发送汉字乱码的问题

native的Socket发送字节流默认是GB2312的,所以在Java方面需要指定GB2312 byte[] buffer new byte[50]; StringBuffer strBuf new StringBuffer(); InputStream input receiver.getInputStream(); while((len input.read(buffer)) ! -1) {String newStr new Str…

最受读者喜爱的前端书 Top 15【留言送书】

最受读者喜爱的前端书Top 15JavaScript高级程序设计(第4版)| 中文版累计销量32万册,JavaScript“红宝书”全新升级 | 涵盖ECMAScript 2019,全面深入,入门和进阶俱佳 | 结合视频讲解配套编程环境,助你轻松掌…

图文结合简单易学的 npm 包的发布流程

大家好,我是若川。我持续组织了近一年的源码共读活动,感兴趣的可以 点此扫码加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。同时极力推荐订阅我写的《学习源码整体架构系列》 包含20余篇源码文章。历史面试…

拟态防御_拟态从未消失。 这就是为什么。

拟态防御Looking back on design languages, what Apple’s WWDC 2020 Keynote means for the future of design languages, and how we move on from here.回顾设计语言,Apple的WWDC 2020主题演讲对设计语言的未来意味着什么,以及我们如何从这里继续前进…

C++二维数组做形参

二位数组作为形参,目前仅知道两种形式,一种直接采用二维数组,一种是用二维指针。以下是做的一个简单的实例。 大家帮我看看,在实际应用中两者有和优缺点。当然,有更好的方式更好了。 以下均应用在字符串数组中 void ar…

经常开发后台管理系统,如何提升自己?推荐~【留言送书】

大家好,我是若川。之前送过N次书,可以点此查看回馈粉丝,现在又和博文视点合作再次争取了几本书,具体送书规则看文末。Vue.js是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是,它可以自底向上逐层应用。Vue…

lottie 动画_使用After Effects和Lottie制作网络动画而不会损失质量

lottie 动画A quick getting started guide快速入门指南 I recently took on a project where the team wanted to add some animated icons and a logo. Besides UX & UI design I am also a motion graphic designer so I took on the challenge of doing it with after…