可以向一个函数传递对象作为参数,也有传值、传引用、传指针三种传递方式。
对象也可以作为函数的返回值,也有传值、传引用、传指针三种传递方式。
为了避免对象的拷贝,经常传递对象的引用。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)
(10,0,0)
a0 Circle.setX(2).setY(30) //此时aCircle的radius成员的值已经是10;
aCircle.setY(30)
(0,0,0)
函数链成立的前提:前两个函数,都要返回一个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的友元。
友元是什么:友元可以在一个类的外部,
不通过这个类的公有函数接口,而直接访问这个类的私有成员。
包括友元函数&友元类。
(嵌套类)
在一个类的内部定义一个类。
本文探讨了C++中对象的多种传递方式及其影响,包括传值、传引用及传指针的区别,并讨论了对象拷贝的问题。此外,还介绍了类的静态成员及其特性,包括静态成员变量和静态成员函数的使用。
2万+

被折叠的 条评论
为什么被折叠?



