节省创建对象数组的技巧

...

不管
Student obj[10];//obj是指针首地址

还是
Student* pStudent=new Student[10];
...
delete  pStudent; ...
实际上最终给各个对象初始化的时候调用的都是默认的构造函数(结构体是没有构造函数的),如果有重载的构造函数的话,再使用这种方式岂不浪费时间?以下是解决方法:
class Student

{
public:
     Student();
     Student(char name[20],int age,float score);
     ~Student();
     void setName(char name[20]){strcpy(this->name,name);}//内联,this指的是当前对象的首地址
     void setAge(int age){this->age=age;}//这也是一种内联函数
     void setScore(float score){this->score=score;}//这也是一种内联函数
     char* getName(){return name;}//这也是一种内联函数
     int getAge(){return age;}
     float getScore(){return score;}
private:
     char name[20];
     int age;
     float score;
};

Student::Student()
{
     cout<<"Stduent constructor"<<endl;
}
Student::Student(char name[20],int age,float score)
{
     cout<<"Stduent constructor"<<endl;
     strcpy(this->name,name);
     this->age=age;
     this->score=score;
}
Student::~Student()
{
     cout<<"Stduent destroy"<<endl;
}

void fun44()
{
     typedef Student* pStu;
     Student** ppStu;
     ppStu= new pStu[10];
     //ppStu[0]->age=20; //错误的写法,因为ppStu[0]仅仅是一个指针,但没有指向任何Student对象
     for (int i=0;i<10;i++)
     {
          *(ppStu+i)=new Student("ccc",i,i/2.0f);//此处调用了重载的构造函数,把new出来的首地址传给*(pStu+i)
     }
     //先释放掉指针数组里的每一个指针,再释放指针数组
     for (int i=0;i<10;i++)
     {
          delete ppStu[i];
     }
     delete [] ppStu;
}
================
1.C++里的内联函数实际上是可以不加inline ,直接把实现定义在class里即可,但要注意代码要短小,Java和C#的编译器实际上也有类似的处理机制,只不过对程序员是透明的
2. 巧妙的运用多星指针,先开辟指向Student的指针(这时的指针都是空指针,不能用),再一个个的new
3. 多星指针的释放,指针的释放确实麻烦,.NET和Java去掉指针也不无道理,但这是以牺牲性能为代价的

时间: 2024-08-16 07:02:02

节省创建对象数组的技巧的相关文章

const对象,NULL和nullptr,C++中创建对象数组

 1.定义成了const之后的类 #include <iostream> class area { public: int x; int y; mutable int z; //不受const约束的类成员 area() :x(10), y(10), z(2) { } void printxy()const //不可以访问类中局部变量 { z = z + 1; std::cout << x << " " << y << &q

js实现过滤重复字符和重复数组-javascript技巧

js实现过滤重复字符 <script type="text/javascript"> <!-- String.prototype.noRepeatStr=function(){ var tempArr=new Array(); for(var i=0;i<this.length;i++){ if(tempArr.join('').indexOf(this.charAt(i))==-1) tempArr[tempArr.length]=this.charAt(i)

使用new关键字创建对象数组(C#,C++,Java)

今天遇到一个题目 分析下面的代码,判断代码是否有误. 1 using System; 2 3 namespace Test1 4 { 5 class Point 6 { 7 public int x; 8 public int y; 9 } 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 Point[] pointArr = new Point[3]; 15 pointArr[0].x = 5; 16 pointA

数组处理技巧

1.针对数组的逻辑判断 1)写一个函数,功能是判断字符串是否为对称的字符串: 涉及数组处理方法:1.concat();2.reverse(); function judgeStr(str) { var a = str.split(''); var b = a.concat([]).reverse(); var i; var count = 0; for(i = 0;i< Math.ceil(a.length / 2);i++ ) { if(a[i] === b[i]) { count++; };

数组小技巧sort()

var numberArray = [3, 6, 2, 4, 1, 5, 13];//实现对该数组的大小顺序序排列,输出[1,2,3,4,5,6,13]                  var arr2 = numberArray.sort(function(a, b) {                if(a > b) {                    return 1;                } else if(a < b) {                    r

php判断多维数组的技巧

直接上代码吧: if(count($array) == count($array, 1)){ echo '一维数组'; }else{ echo '多维数组'; } 看了下手册 int count (mixed $array_or_countable [, int $mode = COUNT_NORMAL ])如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数.对计算多维数组的所有单元尤其有用.

JS获取数组小技巧

有如下数组 var infoArray = strTest.split(";");            var points2;            for (var i = 0; i < infoArray.length; i++) {                var info = infoArray[i];                points2 = info + "," + points2;            }           

php数组使用技巧及操作总结

数组,可以说是PHP的数据应用中较重要的一种方式.PHP的数组函数众多,下面是一些小结,借此记之,便于以后鉴之. 1. 数组定义 数组的定义使用 array()方式定义,可以定义空数组:<?php $number = array(1,3,5,7,9); //定义空数组 $result = array(); $color =array("red","blue","green"); //自定义键值 $language = (1=>&quo

数组小技巧

问题一:在一个数组中找到差值最大的两个数字,要求小数在前大数在后,时间O(n) 想法:从前往后遍历的时候记录最大值和最小值,如果当前最大值在最小值的后面,更新差值的最大值 1 #include <algorithm> 2 #include <iostream> 3 #include <vector> 4 #include <cstdio> 5 6 using namespace std; 7 8 int readint(){ 9 int x;scanf(&q