使用类和对象

本文探讨了C++中对象的多种传递方式及其影响,包括传值、传引用及传指针的区别,并讨论了对象拷贝的问题。此外,还介绍了类的静态成员及其特性,包括静态成员变量和静态成员函数的使用。

可以向一个函数传递对象作为参数,也有传值、传引用、传指针三种传递方式。

对象也可以作为函数的返回值,也有传值、传引用、传指针三种传递方式。

为了避免对象的拷贝,经常传递对象的引用。const 引用。

(为什么传值返回时,要创建临时变量?)

如果传值方式返回,系统将创建一个临时对象,来接收返回值。

int a = 10;

int b = a;

Circle c1;

Cirecle c2 = c1;

        可以把一个对象赋值给另一个对象,对象的每个成员的值,将一对一的拷贝到新的对象。这种拷贝叫逻辑拷贝,或浅拷贝

        但是,如果对象含有指针成员变量,而指针变量又指向堆上空间,将只拷贝指针成员变量本身的值,造成两个对象的指针指向同一堆上的内存空间,删除对象时将造成二次删除

        浅拷贝适用没有指针成员的对象的拷贝。



(1)在构造函数里用初始化列表,比赋值语句效率高。

(2) Accessors get_x( ) and get_y( ), and print( ), are constant functions.

const函数,不能修改成员变量的值。

Functions distance( ) and middle( ) accept two constant reference Point parameters to avoid copying.

    传引用的参数,避免拷贝;const 引用,避免修改成员变量的值。

(3) Functions distance( ) and middle( ) accept twoconstant reference Point parameters to avoidcopying.

    传引用的参数,避免拷贝;const 引用,避免修改成员变量的值。

 (4)  Function middle( ) returns aconst Point object.  The returned valueis constructed by a call to the constructor. The following way also works.

middle函数返回一个Point对象。

const Point & middle(const Point& p1, const Point& p2)

{

  float mid_x = p1.get_x( ) + p2.get_x( ))/2,

float mid_y= p1.get_y( ) + p2.get_y( ))/2;

  

Point local_p(mid_x, mid_y); 

    return local_p; //局部变量只能返回copy,不能返回局部变量的引用

}

 (5) The object returned from function middle( ) is used to call print().  This is called a function chain.  middle函数的返回值(是个Point对象),调用了print函数。形成函数链。

(6) In main( ), two objects are declared, p is then assignedto q.

对象p赋值给对象q,成员变量的一对一拷贝,浅拷贝

数据成员                      非const成员函数           const成员函数

 

非const的数据成员     可以引用 可以改值        可以引用 不可以改值

 

const数据成员           可以引用 不可以改值      可以引用 不可以改值

 

const对象的数据成员    不允许引用和改变值    可以引用 不可以改值


每个对象都隐式的包含了一个成员变量名叫this

this是一个指针,指向对象自己

即this指针里保存的地址,就是对象自己在内存里的地址。



串联成员函数调用。

aCricle.setRadius( rvalue )

aCricle.setX( xvalue )

aCricle.setY( yvalue ) 

To concatenate function calls we want

(0,0,0)

aCircle.setRadius(10).setX(20).setY(30)

1000

a0 Circle.setX(2).setY(30) //此时aCircleradius成员的值已经是10

aCircle.setY(30)

000

函数链成立的前提:前两个函数,都要返回一个Circle对象

问题是:setRadius返回的对象,还是aCircle那个对象本身吗?

如果想通过一条语句给aCircle对象的三个成员变量赋值,要求每个函数返回aCircle对象本身



类的静态成员

他们像全局变量和函数调用之间保留他们的价值(在两次函数调用期间保留原值)但与全局变量可见他们只是从内部功能(仅在函数内部可见),即他们的范围仅仅是函数声明。

静态局部变量(c/c++共有的语法)

静态局部变量放在静态存储区,会自动初始化为0;




静态全局变量(c/c++共有的语法)

作用域:仅在变量所在的文件内。


类的静态成员(c++特有的语法)

迄今为止,我们使用的成员变量和成员函数,都是由某个特定的对象调用。但是,也许有些成员变量成员函数,是属于整个类的。

例如,一个类员工定义存储和操作员工在公司里的个人数据。员工总人数(员工总数)也可以是一个类的数据成员。这个成员是不与任何特定的员工。静态成员的值,和某一个具体对象是无关的。

如果不是静态的数据成员,每一个对象都有一个值,即。一个内存位置,这个对象持有这个值。一个类的静态数据成员只有一个拷贝,即。,只有一个内存地址是分配给这个成员,在这个类可以从任何对象或类的名称。/ /静态成员变量

对于非静态成员来说,每个对象都有一个特定的值,每个对象都为自己的非静态成员,在内存里保留一个位置。

静态成员整个类只有一份copy,不需要每个对象都保留一份copy。

可能还有一个函数来计算每个月所有员工的总工资。这样的成员函数是静态成员函数。/ /静态成员函数

静态成员的访问方式:

类名::静态成员名(推荐)   对象名.静态成员名

静态成员不属于任何对象。




StaticMember Functions: 静态成员函数

c++允许静态成员函数的定义。类似于静态数据的概念,这些变量是类的所有对象共享的,静态成员函数“阶级”功能,(即不与特定对象的类相关联,但类作为一个整体)。(英语语法:不是……但是……)

静态成员函数,被类的所有对象共享。不是和某一个特定的对象、而是和整个类相关联。

静态成员函数内部不可以使用this指针,因为this指针是指向每一个具体的对象的,所以说this指针本身就是非静态成员变量

静态成员函数,也可以有public和private。private的静态成员函数,不能在外部用类名或对象名访问,只能从类内部被其它的静态成员函数访问。


(友元类和友元函数)

友元函数:如果一个类有一个友元函数(友元函数不是这个类成员函数),则该友元函数能访问到这个类的私有成员。

类B是类A的友元类,那么B所有成员函数,可以访问A所有私有成员

即类B的所有成员函数,是类A的友元函数

 

非可交换的:类B是类A的友元类,不等于类A是类B 的友元类。

非可传递的:类B是类A的友元,类C是类B的友元,不等于类C是类A的友元。




友元是什么:友元可以在一个类的外部

不通过这个类的公有函数接口,而直接访问这个类的私有成员

包括友元函数&友元类。


(嵌套类)

在一个类的内部定义一个类。



根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分,聚或者物品之间的有趣关联. 机器学习分 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值