c++用new 创建一类对象数组时,指针对象的表示是怎么表示的。为什么访问pa指针对象函数方法和访问p1的不同

作者&投稿:丰叙 (若有异议请与网页底部的电邮联系)
c++中如何用new生成对象指针~

比如你的Class 为 CMYXXClass
这样就可以了:
CMYXXClass *pMyClass = new CMYXXClass;
pMyClass就是对象指针了,记得取对象名字的时候只要是指针的最好在前面加个p,以后看到就知道它是指针,要不用的时候很容易出错。

new int*[10]

首先 这些问题你可以在<C和指针>这本书中找到 这么多字 还是这么晚 给个分吧。。。
其次 a->b 和 (*a).b 是一个意思 括号是养成良好习惯 你熟知运算符的优先级可以飘逸些。。
其中a 是一个指针 b是一个成员变量或者函数
下面要讲清这个问题非常复杂 以至于我还是推荐你直接看书的好。。。。
。。。。好吧 开始。。。。。
-------> mycla*pa=new mycla[3];

您定义了一个mycla类的对象的数组 对象的堆叠(请允许我这么说)是3次(个)
因为是数组,C(以及他的直接亲儿子C++)是这么来记录数组的:
数组在内存空间上是连续的 那么只要知道对象的类型(用于单个对象单元计算大小),对象的首地址(就是第1个(或者说第0个)对象的首地址),那么就能唯一确定这个数组的长度以及每个对象的位置
那么 pa就应当记录下mycla[3]的首地址 换句话说 这里的pa等于mycla[0]的首地址 也就是说pa=&mycla[0] 又因为上面提及C记录数组的方式,那么mycla这个数组名也代表数组的首地址(其实还包括了“个数"这个信息,以下会继续讲) 那么事实上 pa=mycla=&mycla[0] 这3个东西的”值“是一样的,只不错后2个是常量,pa是变量
------>pa[i].show();
自然pa是一个指向数组的指针,且指向的对象的类型也是事先声明的mycla,那么pa[i]就是*(pa+i)
注意 [ ] 这2个运算符包含了取值运算符*的功能。那么pa[i]就是pa这个指针经过+i后(每次+1指针实际指向的位置的增幅是有编译器根据你申明的类型所决定的,具体的大小是sizeof(mycla))指向了第i个对象,然后*做间接运算,取该地址下的内容。
-------->mycla*p1=new mycla;
这个p1所指向的内容--->不是<----一个数组,而是直接一个变量,那么p1直接做*运算就行了
换句话说 *p1就等于你new的那个对象
--------->p1->setxy(66,88);
这里的->是指针的另一种运算符 ->就等于*().这种用法 你用(*p1).setxy(66,88)是一样的
这是方便程序员的一种写法,让你的程序用指针的方式表达。
---------->pa[i].show(); 貌似你是对这个有问题?这个上面已经讲过了
---------->给你个例子 自己体会 mycla *pLycrus = new mycla[5];
我想调用第3个的set函数 可以这样写
1 *(pLycrus+3).set()
2 (pLycrus+3)->set()
3 pLycrus[3].set()

结论 你的问题在于你根本不了解C的指针和数组是怎么工作的

给你额外启发
sizeof(指针) 返回的是1个字节(或者是2个 或者是4的,实际情况参考你的OS是32或64位,以及编译器的行为。。)。
sizeof(数组名) 返回的是数组的实际大小(根据不同的架构会有不同,为什么过于复杂,不想牵扯)。
指针=数组名 (赋值) 那么 结论是 1. 数组名可以把首地址赋值给指针 但绝不等于指针(比如数组的个数信息等) 2.数组的工作方式是首地址+单个对象的sizeof(类或基本类型)。
再给你而外启发
2维数组的第1维实际保存的是第2维数组的首地址,不想具体解释了 自己去看《C和指针》这本书

你的不理解只是 不理解数组的[ ]运算符 和指针 * ->运算符,以前只是照葫芦画瓢,2个一起出现你就不理解了

你或许会问函数是如何工作的?其实函数名保存的是函数代码的入口地址(函数名是常量!!)。。。也就是说 有的时候你申明了f(int,int) 你调用f(a,b)和 *f(a,b)是一样的 编译器会自动把函数名和入口地址以及指向的函数转换的,只不过当你用到函数指针的时候,才会有差别
有个库函数是 qsort() 具体形式是
void qsort( void *buf, size_t num, size_t size, int (*compare)(const void *,
const void *) ); buf是你指向一段内存区域的首地址, num是你要排序的对象的个数(基本类型也行,总之就是一个sizeof的事),后面那个compare是一个指向函数的指针 你看那个* 这就是具体的用法
好了 上面的*(pLycrus+3).set()的set()是一个函数,其实也是一个指针,只不过这个函数常指针指向了一个编译器分配给你的地址,然后自动执行了上面的函数的操作。。。他们是一样的。。。

pa[i]等价于*(pa+i)
所以用点操作取成员


承德市17649807496: 在c++中使用new关键字new一个类对象数组,为什么会调用构造函数?代码如下: -
剧奚稳心: 创建一个数组,这个数组里有10个Teacher对象,当然要调用无参构造函数啊.为什么?new和new[ ]操作符内部就是先申请内存再调用无参构造.

承德市17649807496: c++中怎样用new申请对象数组 -
剧奚稳心: 就跟申请其他的一样的.比如一个类的名字是 Point那么这样申请对象数组. Point* ppt = new Point[10]; // 申请10个Point对象

承德市17649807496: C++怎么用new创建类对象? -
剧奚稳心: 你是在类B的内部创建类A的对象么? 那非常简单,在类B的内部写(private还是public块都行,根据具体情况) A a; 或者 A *a = new A(); 当然前提是A的构造函数是无参的,如果有参数要写上实参如果是说你的类B继承了类A(即类B是类A的派生类),你想用new创建上转型对象,就成了 A *a = new B();

承德市17649807496: C++,如何用new来创建vector对象? -
剧奚稳心: #include <iostream>#include <vector> using namespace std;int main(void){ typedef vector<int> VECINT; //1、new一个vector,vector里有10个int元素,输出第五个元素的值,然后释放内存. VECINT *vec = new VECINT; cout << vec->at(4) << endl; ...

承德市17649807496: C++ new 声明数组 -
剧奚稳心: class A{ public:A(int n){ m_Number = n;}protected:int m_Number; }; main(){ A ** ppAClass = new A*[8];for(int i = 0; i < 8; i++)ppAClass[i] = new A(i); }

承德市17649807496: C++如何用new动态开辟一个一维字符数组 -
剧奚稳心: C++用new动态开辟一个一维字符数组步骤如下: 1、new 分配内存,通用格式是:类型名 * 指针 = new 类型名;如 int * pi = new int;类型可以是基本数据类型、结构体、自定义类等. 2、delete 来释放内存,通用格式是:delete 指针名;注...

承德市17649807496: C++中怎么创建类对象? -
剧奚稳心: 1、首先,我们需要先写好类的定义,类的定义一般放在头文件中.在此需要注意的是,类名的首字母必须要大写.比如示例中的这个苹果类,其第一个字母必须是大写的 A,而不能是小写 a. 2、在定义类时,我们一般需要先确定好类的属性...

承德市17649807496: C++用new创建类对象问题 -
剧奚稳心: MyClass *a = new MyClass 这句话的意思是创建一个Myclass类型的指针a,并生成一个MyClass对象,使指针a指向这个对象. 这个对象是匿名对象没有名字.

承德市17649807496: C++中怎么用new函数定义一个二维数组? -
剧奚稳心: 假设a,b为两个int型变量,如果希望这样生成一个二维数组:new int[a]<b>,是不会得到编译器允许的——因为没有指定这个数组的元素类型. 由于b的大小未知,编译器无法确定'int<b>'到底是一个什么类型.所以,要用new创建一个二维数...

承德市17649807496: 在C++中,怎样用new创建一个多维的数组? -
剧奚稳心: 给你一个三维的例子: int nx = 10; //行数int ny = 10; //列数int nz = 10; //层数int*** arr_np3D = NULL; //创建//分配第一层arr_np3D = (int***)new int**[nz];//分配第二层for (int i=0; i<ny; i++){arr_np3D[i] = (int**)new int*[ny];}//分配...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网