C++:对象数组与this指针
2016-09-03 11:21
459 查看
C++:对象数组与this指针
标签(空格分隔): c++版本:2 作者:陈小默 声明:禁止商用,禁止转载
该文章仅被发布于作业部落(原) 、 CSDN
C对象数组与this指针
声明对象数组
this指针
代码示例
声明对象数组
由于在C++中我们可以直接操作堆和栈,所以在声明时我们也需要选择数组的创建方式。有一种最显而易见的方法去判断变量的存储状态,就是看对象创建时有没有用new关键字。1,栈数组栈对象
顾名思义就是数组和对象都在当前栈中分配,带来的好处就是对象数组的生命周期有限,我们不需要去手动释放栈中的内存,但是缺点就是创建的对象我们只能在当前栈帧中使用,不能直接将引用返回到其他栈帧。
Student stu[3]={ Student("Jack",90,97,89), Student("Sue",92,95,100), Student("Sam",89,98,99) };
当stu的生命周期终结时,其中所有对象的析构函数都将会被调用。
2,栈数组和堆对象
有时我们需要将分散在堆中数据进行汇总操作,这时就可以使用这种方式创建一个指针数组
Student *students[3]={ new Student("Jack",90,97,89), new Student("Sue",92,95,100), new Student("Sam",89,98,99) };
当students生命周期结束时,这个数组将会被销毁并清空其中的引用。但其中的Student对象仍在堆中存在,并且此时没有任何指针指向这些内存,长此以往将会导致内存泄漏。
this指针
在C++中,this是一个指针常量,指向当前正在调用这个方法的对象。stu[1].show();
如果在show方法中使用了this指针,则这个this指针就代指stu[1]对象。
代码示例
我们以一个学生列表查找最好成绩的例子来演示本节内容,首先仍然是创建一个头文件student.h
//student.h -- Student class interface //version 00 #ifndef STUDENT_H_ #define STUDENT_H_ #include <string> class Student{ //class declaration private: std::string name; int ch; int en; int math; float average; void count(){ average = (ch + en + math+0.0F)/3; } public: Student(); Student(std::string name,int chScore,int enScore,int mathScore); ~Student(); Student & max1(Student & stu); Student * max2(Student * stu); void show(); }; #endif
然后我们去实现
student.cpp,注意,这里我们提供了为上述两种数组的创建方式提供了比较的办法,在max中,我们向一个对象传递了另一个对象的引用,当我们进行判断之后选择是返回自身对象的引用(this)或者是参数对象的引用。
//student.cpp -- implementing the Student class //version 00 #include "stdafx.h" #include "student.h" Student::Student(){} Student::Student(std::string n,int chScore,int enScore,int mathScore):name(n),ch(chScore),en(enScore),math(mathScore){ count(); } Student::~Student(){ cout<<"再见! "<<name<<"."<<endl; } Student & Student::max1(Student & stu){ float a1= (*this).average; float a2=stu.average; return a1>a2?*this:stu; } Student* Student::max2(Student * stu){ float a1= this->average; float a2= stu->average; return a1>a2?this:stu; } void Student::show(){ Student::count(); ios_base::fmtflags orig = cout.setf(ios_base::fixed,ios_base::floatfield); std::streamsize prec = cout.precision(1); cout<<name<<" 同学的语文成绩为"<<ch<<"分,数学成绩为"<<math<<"分,英语成绩为"<<en<<"分,平均成绩"<<average<<"分"<<endl; cout.setf(orig,ios_base::floatfield); }
我们在main方法中实现代码
//Visual Studio 2010 -- main program #include "stdafx.h" #include "student.h" void fun1(); void fun2(); int _tmain(int argc, _TCHAR* argv[]){ fun1(); cout<<endl; fun2(); return 0; } void fun1(){ Student students[3]={ Student("Jack",90,97,89), Student("Sue",92,95,100), Student("Sam",89,98,99) }; Student max = students[0]; for(int i=1;i<3;i++){ max = max.max1(students[i]); } max.show(); } void fun2(){ Student *students[3]={ new Student("Jack",90,97,89), new Student("Sue",92,95,100), new Student("Sam",89,98,99) }; Student * max = * students; for(int i=1;i<3;i++){ max = max->max2(*(students+i)); } max->show(); for(int i=0;i<3;i++){ delete students[i]; } }
以下是代码运行结果
再见! Jack.
再见! Sue.
再见! Sam.
Sue 同学的语文成绩为92分,数学成绩为100分,英语成绩为95分,平均成绩95.7分
再见! Sue.
再见! Sam.
再见! Sue.
再见! Jack.
Sue 同学的语文成绩为92分,数学成绩为100分,英语成绩为95分,平均成绩95.7分
再见! Jack.
再见! Sue.
再见! Sam.
请按任意键继续…
从结果中我们可以看出,当我们使用fun1()中栈对象的时候创建并销毁了3个临时对象。对于大量的数据,创建对象和内容复制的时间浪费是相当大的。对于fun2()来说当我们创建对象成功后,并不需要去赋值内容,而仅仅是将引用传递给数组保存即可。但是要注意的是,堆中分配的数据一定要回收内存。
相关文章推荐
- C++学习笔记(六)-- 类和对象 构造函数和析构函数 const成员函数 this指针 对象数组 堆栈管理变量
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟
- c++对象数组和this指针
- [C++对象模型][3]指针与数组
- android studio2.3.3 模拟器 Jni函数调用C++对象,lldb调试this指针和相关变量显示无效的原因
- C++ 学习之路(2):对象数组和指针
- 对象数组的使用及this指针(自己改的,虽然只是一小点,但是还是有成就感)
- 从零开始学C++之类与对象:类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等
- 从零开始学C++之类与对象:类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等
- C++对象引用和this指针用法
- 从零开始学C++之类与对象:类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等
- [C++对象模型][3]指针与数组
- C++ 常成员函数和常对象以及this指针的重要理解
- 详解C++中的this指针与常对象
- c++;对象引用前加const报错:不能将“this”指针从“const a”转换为“a &”
- C++ 对象和类(十七)--operator+、private、public、protected、this->指针
- C++之指针(对象指针+对象成员指针+this指针[待补充])
- C++ 类 & 对象-C++ 内联函数-C++ this 指针-C++ 类的静态成员
- C++对象指针和this指针~