从今天起开始写一系列C++文章,目的是帮助页游(ActionScript)开发者更好的学习和了解cocos2d。
这节的主要知识点:struct、重载、操作符重载、常量、隐式转换
1.Color3b的声明部分在ccTypes.h,c++允许文件名和类名(color3b不是类是结构体)不一致,这一点和actionscript(以后简写为as)不一样。
那这里为什么用了结构体而不用类?类和结构体有什么区别?
一般来说struct和class本质区别是默认的访问权限,struct是public,class是private 。struct一般用于描述纯的数据结构,class用于描述带行为的对象。
而as中默认的访问权限是internal,对当前包内的引用可见,在c++没有类似java或as这样的包的概念。
2.从行45和行46可看出二个构造函数一样.c++叫重载,什么叫重载?
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表,返回值类型一致的函数,这组函数被称为重载函数。
类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!
3.在47和48行同样是重载的构造函数,但多了个关键字,explicit,C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。
explicit构造函数是用来防止隐式转换的。请看下面的代码:
4.50到55行:操作符重载和const
先看看函数的实现,可以看出operator==和operator!=是配对的,而且是必须的。重载操作符不能改变操作符的操作数。但这里有一点需要特别注意,如果重载操作定义为成员函数,那么他的形参比操作数数目少一,因为this指针已经指向了调用这个操作的对象了;如果重载操作定义为非成员函数(一般设为友元函数),那么操作数与形参个数相等
const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。
class A
{
void function()const; //常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。
}
对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。
5.57行:按引用传值,先看看下面的代码:
#include <iostream>
using namespace std ;
void Swap(int x, int y) ;
int main(void)
{
int a = 1 ;
int b = 2 ;
cout << "a = " << a << ", " << "b = " << b << endl ;
Swap(a, b) ;
cout << "a = " << a << ", " << "b = " << b << endl ;
system("pause") ;
return 0 ;
}
一:值传递
void Swap(int x, int y)
{
int temp = x ;
x = y ;
y = temp ;
}
输出结果:
a = 1, b = 2
a = 1, b = 2
原因:Swap(int x, int y)函数采用值传递的方式,传入的实参实际上是a和b的副本而非其本身,所以对副本的改变并不会反应到a和b本身上。
二:引用传递
void Swap(int &x, int &y)
{
int temp = x ;
x = y ;
y = temp ;
}
输出结果:
a = 1, b = 2
a = 2, b = 1
原因: Swap(int x, int y)函数采用引用传递的方式,传入的实参实际上是a和b的引用,对引用的改变会直接反应到a和b本身上。
三:指针传递
1. 改变指针本身
void Swap(int *x, int *y)
{
int *temp = x ;
x = y ;
y = temp ;
}
调用方法:Swap(&a, &b) ;
输出结果:
a = 1, b = 2
a = 1, b = 2
原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参实际上是a和b的指针的副本,而且改变的是副本本身而非其间接引用,所以不会影响的指针所指向的值,即a和b本身上。
2. 改变指针的间接引用
void Swap(int *x, int *y)
{
int temp = *x ;
*x = *y ;
*y = temp ;
}
调用方法:Swap(&a, &b) ;
输出结果:
a = 1, b = 2
a = 2, b = 1
原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参虽然也是a和b的指针的副本,但是改变的是副本的间接引用,无论是指针本身还是其副本,都指向相同的值,所以这个改变会反应到a和b本身上。
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
6.66到74:静态成员和const 和as一致
部分资料来源于网络,未知出处。