C++面向对象第一周笔记<Boolan>

来源:互联网 发布:法国大革命 评价 知乎 编辑:程序博客网 时间:2024/06/07 23:11

C++编程简介

C++的历史:B语言(1969年) -> C语言(1972年) -> C++(1983年)(最早叫C with class);


学习C++就是学习C++语言和C++标准库;


单一class的设计称为:Object Based(基于对象);


多class关联起来称为:Object Oriented(面向对象);


头文件与类的声明

C与C++在数据和函数方面对比:C中的数据是全局的,任何程序内的函数都可以处理,而C++中的数据与处理这些数据的函数是包在一起的,别人是看不到的。这种打包的形式就是class,再根据class创造出Object来处理数据。class相当于与C中的struct(构造体),与C++中的struct(构造体)基本相同。

C++内每一个单元就是一个class,class经典的分类是根据pointer分为带pointer(指针)和不带pointer(指针)两类;

代码基本形式:
头文件名.h通过#include(含入).cpp主程序中,标准库头文件用<>括起来,自己写的头文件用""括起来。
需要注意的是.h和.cpp在有些编译器中不一定是这种延伸文件名(extension file name),也可能是.hpp或者其他或者甚至无延伸名,一切看编译器的规定。

guar(防卫式声明):
#ifndef __NAME__  //告诉编译器,如果没定义过NAME这个东西的话,
#define __NAME__//就把它定义出来。
... ...
#endif

头文件的布局:
forward declarations(前置声明);
class declarations(类声明);
class definition(类定义)。

任何一个class 都有一个head(头)和一个body(身体);
class head是class的名字;
body内是class的数据和函数;
body内可以定义函数也可以声明函数然后再body外定义。

模板:
template<typename T>
告诉编译器,T是类型名字,我暂时还不确定,我用的时候你再根据我的要求替换。

inline(内联)函数
在class的body中定义的函数就是inline函数;
它由宏的特性但是没有宏的缺点;

宏的优缺点:

{优点

避免了意义模糊的数字出现,使得程序语义流畅清晰;

可以方便的进行参数的调整与修改;

提高了程序的执行效率,由于使用了预编译器进行值代替,并不需要为这些常量分配存储空间,所以执行效率较高。

缺点

         预编译语句仅仅是简单的值代替,缺乏类型的检测机制。这样预处理语句就不能享受C++严格的类型检查的好处,从而可能成为引发一系列错误的隐患。};

是否inline(内联)是编译器所决定的,你只能建议编译器取inline,例如过于复杂的函数编译器没能力帮你内联。


access level(访问级别)

public:公开的,可以被外界看到的,函数部分可以被外界使用的;

private:内部的,私有的,只有class内才能看到与拥有,一般为封装的数据,有时候也会有函数。


constructor(ctor,构造函数)

如果想要创建一个对象,构造函数会被自动调用;

构造函数名称与类名称相同,才可以叫做构造函数;

可以拥有参数,参数可以有默认值(default argument );

没有返回类型;

可以在传参后加“:”来设置initialization list(初始列,初值列),当然也可以在函数body中设置,但是在initializa list(初始列,初值列)中更优,因为她是在程序初始化时候工作,在时间点上要比body中提前,效率更高;

不可能在程序中直接调运构造函数,因为没有这样的语法,但是你可以直接创建对象,构造函数会自动调用;

与构造函数对应的是析构函数。


ctor(构造函数)可以有很多歌 - overloading(重构)

同一个函数名称有一个以上的函数叫做函数重载;

看似名称相同的两个函数,实际上在编译器编码时,会根据传入参数,返回值等一系列的数据来区分两个同名的函数,也就是说实际上在编译器看来这两个函数还是不同名的;

如果创建一个对象时,编译器发现两个重构函数都可以使用时,她会分不清选择用哪个用哪个而产生冲突,我们要避免这种情况发生。


constructor(ctor,构造函数)被放在private区确实时可以的。


const member functions(常量成员函数)

double real()const{return re;};

在传参()与函数body{}间,间const,表示不能改变数据内容;

class内的数据分为会被改变内容和不会改变内容的两种,确认不会改变数据内容的参数,马上加上const;


参数传递:pass by value VS. pass by reference(to const)

by value :传数据;

by reference:传引用,引用相当于指针,传的是数据的地址;

能传引用尽量传引用,传不了引用再传数据。如果传引用只是传递参数而非改参数,我们可以在引用前加const。

return返回值传递也是同样道理。


friend(友元)

在private中的封装数据和函数,friend可以直接读取,但是这打破了封装!

相同class的各个object互为friend(友元);


小结下:

数据放在private中;

参数传递尽可能用reference,要不要加const看情况;

返回值也尽可能的用reference;

在body中的函数能加const的就要加,能加不加有漏洞;

构造函数的特殊的语法叫initialization list,尽量用;


什么情况下可以return by reference?

在传出修改参数本身时return 引用;

在传出新建参数时,传出value;


所有的成员函数都带有一个隐藏的参数 this,this指向调用者;

传递者无需知道接收者是以reference形式接受,无视接受类型;

返回local object时,函数绝不可以是return by reference;

temp object(临时对象)
typename ();
生命生命周期为一行,没有名字。

重载“<<”这类特殊操作符只能用全局函数重载;


0 0
原创粉丝点击