C++对象和类(补充)

this 指针

假设比较两个stock对象的tot_val值,并且返回较小的那个,

定义了如下这个函数:

const stock& stock::topval(const stock& s) const
{if(s.tot_val>tot_val)return s;elsereturn which?
}

这种情况下,应该返回哪一个对象呢?

可以使用特殊指针 this ,它指向用来调用成员函数的对象(this 被作为隐藏参数传递给方法),这样,就可以返回它所指向的值。

假设有以下方法调用:

stock1.topval(stock2);

那么,this指针将指向stock1对象,方法定义中的tot_val实际上是this->tot_val 的简写。

注意 每个成员函数都有一个this指针,包括构造函数和析构函数,如果需要引用整个对象,可以使用*this ,在括号后面使用const 限定符,这样可以限定指针不对对象的值进行修改。

所以上面可以修改为:

const stock& stock::topval(const stock& s) const
{if(s.tot_val>tot_val)return s;elsereturn *this;
}

对象数组

声明对象数组的方法与声明标准类型数组相同。

数组每个元素的用法和单独一个对象完全相同。

可以使用构造函数来初始化数组元素。在这种情况下必须为每个元素使用构造函数。

stock stocks[4]={stock("1",1,1),stock("2",2,2),stock("3",3,3),stock("4",4,4)
};
stock stockse[10]={stock("1",1,1),stock("2",2,2),stock(),stock("4",4,4)
}

第一个使用构造函数为每一个元素赋值,第二个初始化时调用构造函数为前四个元素赋值,其余的使用默认构造函数或者默认参数为元素赋值。

初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容赋值给数组元素,因此,创建类对象数组,此类必须有默认构造函数。

在初始化时也可以使用列表初始化,这种方法更加简洁:

stock stocks[4]={{"1",1,1},{"2",2,2},{"3",3,3},{"4",4,4}
};
stock stocks[4]{{"1",1,1},{"2",2,2},{"3",3,3},{"4",4,4}
};

类作用域

在类中声明的名称的作用域都是整个类,作用域为整个类的名称只在该类内是已知的,在类外是不可知的,因此使用不同类内的相同名称不会冲突。类作用域意味着不能够从外部直接访问类成员,公有成员函数也是如此,也就是说要想调用公有成员函数,必须通过对象。

在使用类成员时,需要根据上下文使用直接成员运算符. 、间接成员运算符-> 和作用域解析运算符::

作用域为类的常量

有时候需要定义符号常量在类作用域中使用:

class aaa{private:const int Month=12;double bbb[Month];......
};

但是这样做是行不通的,类只是描述对象的形式,并没有创建对象,在创建对象前,没有用于存储的空间。可以使用下面两种方法来进行声明定义:

  • 枚举: 在类中声明的枚举作用域为整个类。
class aaa{enum{Month=12};double bbb[Month];......
};

使用枚举并不会创建类数据成员,所有对象中都不包含枚举,Month只是一个符号名称,在作用域为类中的代码中遇到他时,编译器将其替换为12。

由于只是创建一个符号常量,而不使用枚举类型变量,因而不需要提供枚举名称。

  • static
class aaa{static const int Month=12;double bbb[Month];
};

创建一个静态变量,并不存储在对象中,只有一个Month变量,被所有此类共享。

作用域内枚举

假设一个类中有如下两个枚举:

enum a{bottom,medium,top};
enum b{bottom,medium,top};

这将无法通过编译,因为他们位于相同的作用域内。为此,C++提供了一种新枚举:

enum class a{bottom,medium,top};
enum class b{bottom,medium,top};

这样的话而这就不会冲突们,要像下面一样使用枚举量:

a choicea=a::bottom;
b choiceb=b::top;

也可以使用关键字struct 代替关键字class ,用法与上面相同,也是使用作用域解析运算符来限定名称。

C++11提高了作用域内枚举的类型安全,在有些情况下,枚举类型将自动转化为整型,比如说将枚举赋值给int变量或者用于比较表达式时,但是作用域内枚举不能够隐式的转换为整型,但是可以进行显示的转换。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部