c++ 基本类型 是类吗
- 提问者网友:雾里闻花香
- 2021-03-11 17:10
- 五星知识达人网友:时间的尘埃
- 2021-03-11 17:43
首先拿2个实例进行下对比下看看吧:
1.可以用语句
int a(9);
进行初始化,
2.但是不能用
int a;
a(9);
进行初始化;
如果int类型真的是按照类的机制进行设计的话,那么第二种初始化方法应该是可以的。但事实说明,int等基本类型不是按照类的机制设计的。而允许你像你说的那样赋值是为了与类的初始化函数形式上保持一致,但必须声明与初始化同时一条语句进行。
希望我的回答能够对你有帮助~
- 1楼网友:深街酒徒
- 2021-03-11 19:58
- 2楼网友:掌灯师
- 2021-03-11 19:00
关于指针必须清晰的理解,我结合相关的知识并且举一些示例来说吧,希望你能明白
指针,数组,以及他们作为函数参数,或是返回值的异同.这些都是让初学c++的人很头痛的事.
首先我们要清楚尽管指针与数组在有些地方可以通用,但它们两个是不同的,这一点要切记.
先来看看它们声明时的区别,在32位系统中指针是一个4字节的变量或常量.其存放的内容为一个地址值,也就是其指向的地址值.
而数组是一个连续的存放相同数据类型的数据结构,我们通常所说的数组名就是指向其数组首地址的指针,
这句话没错,但就我的理解它还不是一个真正意义上的指针.因为并没有一块内存是用来单独存放这个地址
的.
我们可以用sizeof()操作符来证明这一点,sizeof一个指针和一个数组名得到的结果是不同的(除非你的数组长度和指针长度相同).
在作为函数参数传递的时候,指针与数组是相同的,这个我们众所周知.所谓的传值与传址,其实都是传值,
都是将原值的拷贝传给函数.只不过当传递指针的时候传递的是指针的值(就是其指向的地址).当传递数组
的时候同样是传递的数组的首地址(把首地址作为一个值传递给函数).这就是为什么在函数内部我们可以 像操作一个指针一样操作一个传进来的数组,而在外面却不能这样做,看下面的例子:
void arraytest(int* a) ...{ a++; } int main() ...{ int array[10]; array++;//错误 arraytest(array);//在函数内部可以当作指针来操作 }
到这里我们已经基本明白了指针与数组的区别,下面我们来看看让人比较迷惑的例子.
#include <stdio.h> char *retstr() { char str[]="hello world! "; printf(str); return str; } int main() { char *ptr; ptr=retstr(); printf(ptr); return 0; }
上面的程序编译不会出错,而只是给出了一个[warning] address of local variable `str' returned的 警告.显然它没有达到我们的目地,继续看下面:
#include <stdio.h> char *retstr() { char *str="hello world! ";//注意这里 printf(str); return str; } int main() { char *ptr; ptr=retstr(); printf(ptr); return 0; }
这个程序能够很好的运行,也达到了我们返回一个指向字符串的指针并利用返回的指针显示字符串的目的.
但第一个程序为什么不行呢,这里就是它们作为返回值的不同地方了.严格来说,本地数组是不能作为函数 返回值的,其返回的值是指向系统栈的地址,这个地址的内容在函数返回的时候会被清楚,所以你不知道其 指向的内容到底是什么,这就是为什么在你执行第一个程序的时候会看到乱码了.
而第二个程序声明了一个本地指针,其指向的内容是一个常量,当然常量肯定是存放在系统堆上的,在函数 返回的时候函数把这个指针指向的地址返回,并将指针本身销毁.这是我们还保留这系统堆上的这个字符串 的地址,当然我们就可以用这个地址对其操作了.
还有一个比较有意思的关于指针作为参数的例子:
void getmemory(char *p) { p = (char *)malloc(100); } void test(void) { char *str = null; getmemory(str); strcpy(str, "hello world"); printf(str); }
这个程序将会崩溃,我们先看下面程序然后解释
void getmemory2(char **p) { *p = (char *)malloc(100); } void test(void) { char *str = null; getmemory(&str); strcpy(str, "hello world"); printf(str); }
这个程序执行没有问题输出hello world.细心的人不用说已经知道原因了,这就是我们前面说过的,当指针的值作为参数传递时,其只是简单的将
自己的值拷贝给函数,而且函数肯定不会改变这个值.但函数可以改变这个值指向的内容.第二个函数就是利用传递给它的一个指向指针的指针,来改变这个指针所指向的指针的内容的.