C++ 学习笔记之---对象和类

参考自《C++ Primer Plus 6th Edition》和 《C++ Primer 5th Edition》

(本博文中知识点较为零散和基础,主要用于本人的学习回顾)

访问所创建对象的公有成员

1. 自动存储类对象:  "句点方法"

2. 动态存储类对象(使用new):  我们创建了一个匿名的对象,并把这个对象的地址传给了一个指针。我们可以使用指针的指向符"->"来访问公有成员,也可以使用"*"对指针进行反引用,然后用"句点方法"来访问公有的成员变量。

e.g.

Stock * A = new Stock;  // 动态创建一个Stock对象,把对象的地址赋给指针A
A->show()          // accepted
(*A).show()          // accepted

3. 静态存储类对象: "句点方法"

4. 临时对象: "句点方法"

创建对象的一种语法可能会导致编译器的两种理解

e.g.     Stock stock = Stock();

在这个语句中,按照C++标准,编译器有两种可能的方式来执行这个语法:

1. 将语句理解为:  Stock stock;

2. 先创建一个Stock类的临时对象,再将这个临时对象复制到stock

const成员函数

若你创建了一个用const 修饰的类对象,则它被禁止调用一个没有用const修饰的成员函数

因为,你不能向编译器保证,你的这个成员函数的函数体不会修改调用它的对象

打个比方,比如你定义了一个用const 修饰的变量,还有一个函数,这个函数的其中一个参数是同类型的一个引用

如果你要把这个const 变量当作这个参数传给函数,那么这个形参列表的这个引用要用const 修饰,这样才能保证不修改这个常量

e.g.

void test(const int & r) {
  std::cout << "hello world !\n";
}

int main(int argc , char *argv[] ) {
  const int a = 5;
  test(a);
  return 0;
}

但是问题来了,这个例子不能类比用来解决问题啊,因为对象调用成员函数的时侯,不能显式地把自己当成参数传到成员函数的形参列表中!其实对象直接调用成员函数或对象指针间接调用成员函数的时侯,会把真正对象的地址传给成员函数中隐藏的参数this指针。而且成员函数中涉及成员变量的访问都要通过this指针来访问。问题的症结就在于: 怎么保证函数的执行过程中,this所指对象中的成员变量不会被修改?

C++引入了一种语法来解决这个问题:将const关键字放在函数的形参列表后面。就算你还是不小心,在函数体中写了修改对象成员变量的操作,编译器还是会善意提醒你的。

由以上,我们可以总结出一个好的编程习惯: 按《C++ primer plus 6th Edition》上的原话--“就像尽可能将const引用和指针用作函数行参一样,只要类方法不修改调用对象,就应该将其声明为const”,不管所创建的对象是否使用const修饰,这是一个很好的编程习惯。

就像这样:

 void show() const;

这是声明的时侯。实现的时侯呢,把const放在形参列表后面,函数体的花括号前面即可。

void Stock::show() const {
  /* implementation*/
}
时间: 2024-10-23 03:44:18

C++ 学习笔记之---对象和类的相关文章

javascript学习笔记---ECMAScriptECMAScript 对象----定义类或对象

使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象. ECMAScript 拥有很多创建对象或类的方法. 原始的方式 因为对象的属性可以在对象创建后动态定义(后绑定),类似下面的代码: var oCar = new Object; oCar.color = "blue"; oCar.doors = 4; oCar.mpg = 25; oCar.showColor = function() { alert(this.color); };不过这里有一

[Java学习笔记]-Java对象和类

Java是完全面向对象的高级语言,其基本的操作基本都是针对相应的对象和类.面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.对应面向对象的语言,还有一种面向过程的语言,如C语言.面向对象的语言是在面向过程语言的基础上发展而来的.面向对象(OOP,全称为Object-Oriented-Programer,下文简称为OOP)相对于面向过程的语言而言,其优势在于很多问题的解决方法被封装在对象里,有时只需要创建这样的对象就可以解决我们的问题,而不必关心其具体实现细节,这

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面

javascript学习笔记---ECMAScriptECMAScript 对象----修改对象

通过使用 ECMAScript,不仅可以创建对象,还可以修改已有对象的行为. prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法. 创建新方法 通过已有的方法创建新方法Number.prototype.toHexString = function() { return this.toString(16); }; 在此环境中,关键字 this 指向 Number 的实例,因此可完全访问 Number 的所有方法.有了这段代码,可实现下面的操作: var iNu

java学习笔记07--日期操作类

java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. [java] view plaincopy public class T { public static void main(String[] args) { Date date  = new Date(); System.out.println("当前日期:"+date); //当前日期:Thu May 16 23:00:57 CST 

Java学习笔记_23_List接口实现类

23.List接口实现类: List接口继承了Collection接口,它是一个允许存在重复项的有序集合. 1>实现类ArrayList: ArrayList类支持可随需要而增长的动态数组.数组列表以一个原大小被创建,当超过了它的大小, 类集自动增大,当对象被删除后,数组就可以缩小. 优点:ArrayList类对于使用索引取出元素用较高的效率,他可以用索引快速定位对象. 缺点:ArrayList类对于元素的删除或插入速度较慢. 构造方法: · ArrayList(): 构造一个初始容量为10的空

C++学习笔记之作用域为类的常量和作用域内的枚举

一.作用域为类的常量 有些情况下,使符号常量的作用域为类很有用.如,类声明(不是定义)可能使用字面值30来指定数组长度,由于该常量对于所有对象来说都是相同的,因此创建一个由所有对象共享的常量是个不错的主意,也许我们想像下面这样做: 1 class Weather 2 { 3 private: 4 const int Months = 12; //声明一个常量 5 double temperature[Months]; 6 ... 7 } 要注意的是,我们这是在声明阶段,需要在声明类的时候就有一个

Unity3d之Hash&amp;Slash学习笔记(一)--角色属性类的构架

角色属性类的构架 角色属性类有8个类,继承关系如下图: 每个类的具体作用见之后的随笔 Unity3d之Hash&Slash学习笔记(一)--角色属性类的构架

java学习笔记(三)类,对象,包

在面向对象编程中,程序不是围绕着要解决的任务来设计,而是围绕着要解决的问题的对象来设计. 类:是具有相同属性和行为的一组对象的集合,类中要包含这个类的属性和方法,但并不是所有的类都必须包含属性和方法. 例:编写一个学生类,学生拥有学号,姓名,年龄,性别等. /** *学生类 */ public class Student{ /* 属性 */ public int stuNo; public String name; public int age; public String sex; /* 方法