在堆栈中,保留了内存main,我们称之为main函数的堆栈帧.
当我们调用该Add函数时,内存保留在堆栈顶部.在Add函数的堆栈帧,a并且b是本地指针和c是计算的整数,然后我们返回参考.c是Add函数的局部变量.
现在当Add函数执行完成时,堆栈中的内存空间也被释放,所以当我们尝试在mainwith指针中访问这个地址时p,我们试图访问的内容基本上是一个释放空间.编译器发出警告,但为什么它仍然正确打印值5?
答案可能是机器没有释放内存空间,因为它没有必要,因为没有更多的功能.但是如果我们编写另一个函数,Hello那么它肯定应该释放Add调用堆栈中的函数空间,但程序仍会打印
Yay 5
Run Code Online (Sandbox Code Playgroud)
是因为像在堆中我们需要null在释放它之后指定一个指针,否则我们仍然可以访问它?有类似的东西吗?
/* void Hello()
{
printf("Yay");
} */
int* Add(int *a,int *b)
{
int c=*a+*b;
return &c;
}
int main()
{
int a=1,b=4;
int *p=Add(&a,&b);
// Hello();
printf("\t%d",*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 假设没有 Hello 函数,我们只是在 main 中调用 ob.display ,然后它调用 B 类而不是 A 类的显示函数。
函数 display() 的调用由编译器设置为基类中定义的版本一次。这称为函数调用的静态解析,或静态链接——函数调用在程序执行之前就被固定。这有时也称为早期绑定,因为 display() 函数是在程序编译期间设置的。
现在如何在基类中的显示函数之前不使用 virtual 关键字(后期绑定)来调用派生类的显示函数?
现在,在这个程序中,将对象作为按值调用、按指针调用和按引用调用 Hello 函数进行传递都可以正常工作。现在,如果我们使用多态性并希望在调用派生类的成员函数时显示它,我们必须在基类中的显示函数之前添加 virtual 关键字。如果我们通过指针调用和引用调用来传递对象值,它会调用派生类中的函数,但如果我们通过值传递对象,则不会,为什么会这样?>
class A
{
public:
void display(); // virtual void display()
{
cout << "Hey from A" <<endl;
}
};
class B : public A
{
public:
void display()
{
cout << "Hey from B" <<endl;
}
};
void Hello(A ob) // &ob //*ob
{
ob.display(); // ob->display()
}
int main()
{
B obj;
Hello(obj); // obj …Run Code Online (Sandbox Code Playgroud) 这里已经讨论了这个问题[链接] new []是否在C++中调用默认构造函数?
作为一个初学者和一个自学者,将赞赏积极的评论,请不要将其概括为广泛,狭隘等
当我们使用new []时,每个元素都由默认构造函数初始化,除非类型是内置类型.默认情况下,内置类型保持单一化.
这里有人说默认构造函数初始化对象是什么意思?是不是每个对象现在都将键初始化为零(由默认构造函数),因为当我打印p [2] .key时这是真的?
如何检查默认构造函数是否初始化数组或不是int数组,它无法访问main中的成员键?
另外(i)打印垃圾值,但(ii)打印0;
class People
{
public:
int key;
People()
{
key=0;
}
};
int main()
{
int count=5;
People *p=new People[count];
cout<< p[2].key;
// int *arr=new int[count]; ...(i)
//cout<<*(arr+2);
//int *arr=new int[count](); ... (ii)
//cout<<*(arr+2)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 如果静态类成员和静态类函数有类范围,那么为什么我不能访问显示函数(它显示错误)?如果代替显示功能我写入计数它显示正确的值,即0
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
static int Length;
static void display()
{
cout<< ++Length;
}
};
int Person::Length=0;
int main()
{
cout<< Person :: display(); //error
// Person :: Length shows correct value
return 0;
}
Run Code Online (Sandbox Code Playgroud) 如果分配可以多次完成,那么为什么它会显示错误.如果相同的代码在main中,则没有显示错误.
#include <stdio.h>
int arr[2]; // array elements are initialized as zero
arr[0]=5;
arr[1]=10;
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)