关于c++教程学习中的一些问题?
#include "iostream"
using namespace std;
void main ()
{
int a=4,b=5;
cout<<"在main函数中交换之前……"<<a<<" "<<b<<endl;
swap(a,b);
cout<<"在main函数中交换之后……"<<a<<" "<<b<<endl;
}
void swap(int &a,int &b)
{
int c;
cout<<"在swap函数中交换之前……"<<a<<" "<<b<<endl;
c=a;
a=b;
b=c;
cout<<"在swap函数中交换之后……"<<a<<" "<<b<<endl;
}
在main函数中交换之前……4 5
在main函数中交换之后……5 4
由运行结果我们可以看到,swap函数是被调用了的,那么为什么没打印出swap函数中的输出语句呢?还有就是为什么swap函数在main函数的后边申明,为什么没报错,如果改成像c语言的那样,把函数的申明放在main函数中,输出的结果为:
在main函数中交换之前……4 5
在main函数中交换之后……4 5,这就说明没有调用了swap,这又是为什么呢?我们并没有改变调用语句。为了好说明我把完整的代码放到下面。
#include "iostream"
using namespace std;
void main ()
{
int a=4,b=5;
void swap(int &a,int &b);
cout<<"在main函数中交换之前……"<<a<<" "<<b<<endl;
swap(a,b);
cout<<"在main函数中交换之后……"<<a<<" "<<b<<endl;
}
void swap(int &a,int &b)
{
int c;
cout<<"在swap函数中交换之前……"<<a<<" "<<b<<endl;
c=a;
a=b;
b=c;
cout<<"在swap函数中交换之后……"<<a<<" "<<b<<endl;
}
我们把swap函数的申明语句放到了main函数的外边后(在c语言中我们说这样的函数是全局函数),为什么这次的输出结果就是正确的呢?同样为了方便说明我把代码粘贴在下面:
#include "iostream"
using namespace std;
void swap(int &a,int &b);
void main ()
{
int a=4,b=5;
cout<<"在main函数中交换之前……"<<a<<" "<<b<<endl;
swap(a,b);
cout<<"在main函数中交换之后……"<<a<<" "<<b<<endl;
}
void swap(int &a,int &b)
{
int c;
cout<<"在swap函数中交换之前……"<<a<<" "<<b<<endl;
c=a;
a=b;
b=c;
cout<<"在swap函数中交换之后……"<<a<<" "<<b<<endl;
}
代码对应的输出语句为:
在main函数中交换之前……4 5
在swap函数中交换之前……4 5
在swap函数中交换之后……5 4
在main函数中交换之后……5 4
=======================================================================================================================
#include "iostream"
using namespace std;
class A
{
public:
A(){x=new int;*x=5;}
A(const A &a){ x=a.x; cout<<"复制函数执行中……\n";}
~A(){ delete x; x=NULL; }
void Print()const{cout<<"x="<<*x<<endl; }
void set(int i){*x=i;}
private:
int *x;
};
void main ()
{
A *a=new A;
a->Print();
cout<<endl;
A b=(*a);
b.Print();
delete a;
cout<<endl;
}
在上面的代码中,我们在堆上创建了个对象并且用指针a来保存对象a的地址,由于对象a的副本b的成员变量指针x跟对象a的成员变量指针x指向了同一块区域,那么当我们在对堆上的对象执行析构函数的时候程序会崩溃(因为副本b的成员变量x,现在指向了一块无法访问的区域)。
#include "iostream"
using namespace std;
class A
{
public:
A(int i){x=i;cout<<"构造函数执行中……\n";}
A(A&a){x=a.x;cout<<"复制函数执行中……\n";}
~A(){cout<<"析构函数执行中……\n";}
int Get(){return x;}
private:
int x;
};
A func()
{
cout<<"跳转到func函数中……\n";
A a(24);
cout<<"&a"<<&a<<endl;
return a;
}
void main ()
{
A *a=&func();
cout<<"a的地址为:"<<a<<endl;
cout<<a->Get()<<endl;
}
在这个类子中,我们是在栈上创建了个对象a,在这里当函数返回的时候会调用析构函数来析构掉对象a的副本和对象a,但是在析构后我们还是可以通过get函数来得到对象a的成员变量x的值,在还没有其他变量的值覆盖这个值的时候。通过比较上面的两个代码,我的问题是:在堆上创建的对象在执行析构函数的时候跟在栈上创建的对象在执行析构函数的时候有什么不同吗?如果有,那么在对创建在堆上的对象执行析构的时候,析构函数的作用又是什么呢?还有一点就是关于上面的代码A b=(*a);这条语句不理解,我想他的作用是来调用类A的构造函数来创建一个对象a的副本,并且附给对象b,但是我把这条语句改成A b=new A(*a);的时候,编译器提示出错,这是为什么呢?还有就是对于这条语句中,对象b是保存在堆上呢,还是保存在栈上呢?我的理解是 :对象b保存在栈上。还有一点就是,对于保存在栈上的对象不是不要我们手动写代码来释放么?
[解决办法]
哥们,swap函数与库函数重名了,换一个吧
[解决办法]
你现在调用的是API中的swap所以编译器没有报错,建议你换个函数名字吧,这样你就知道错在哪里了
[解决办法]
swap函数与库函数重名了
[解决办法]