QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3700|回复: 21

unreferenced local variable???

[复制链接]
发表于 2003-4-21 04:13:01 | 显示全部楼层 |阅读模式
[code:1]
#include <iostream>
#include <string>

using namespace std;

typedef struct
{
        string landLord;
        string address;
        int bedRooms;
        float price;
} AptType;

void ReadMembers(AptType& apt)
{
        // read values from keyborad
        // into the members of struct parameter apt. The order in
        // which the data is read is the same as that of the items
        // in the struct.
        string landLord;
        string address;
        int bedRooms;
        float price;

        cout << "Please enter the landlord: " << endl;
        cin >> apt.landLord;
        cout << "Please enter the address: " << endl;
        cin >> apt.address;
        cout << "Please enter the number of the bedrooms: " << endl;
        cin >> apt.bedRooms;
        cout << "Please enter the price: " << endl;
        cin >> apt.price;
}

int main()
{
        AptType apartment;

        // Read values into the members of apartment variable.
        ReadMembers(apartment);

        // Print out the values of members.
        cout << "The landlord is " << apartment.landLord << endl;
        cout << "The address is " << apartment.address << endl;
        cout << "The number of bedrooms is " << apartment.bedRooms
                << endl;
        cout << "The price is " << apartment.price << endl;

        return 0;
}
[/code:1]

编译可以成功, 也可以运行, 但它总给我两个Warning, 就是在void ReadMembers()里的price和bedRooms说是"Unreferenced local variable", 为什么????
发表于 2003-4-21 04:31:52 | 显示全部楼层
你在ReadMembers()中定义的这四个变量:
[code:1]
   string landLord;
   string address;
   int bedRooms;
   float price;
[/code:1]
一直没有用到,所以就会出现这个警告了。
把这四个变量的定义去掉就好了。
回复

使用道具 举报

 楼主| 发表于 2003-4-21 04:39:39 | 显示全部楼层
那为什么landLord和address没有表示"Unreferenced local variable"?
回复

使用道具 举报

发表于 2003-4-21 10:29:43 | 显示全部楼层
[quote:abb916d8f7="CNOOC"]那为什么landLord和address没有表示"Unreferenced local variable"?[/quote]

who know? who care?
i think andot is right.
回复

使用道具 举报

 楼主| 发表于 2003-4-21 10:36:31 | 显示全部楼层
I don't know, but I care. I know it works andot's way, but why and how?
回复

使用道具 举报

发表于 2003-4-21 10:41:10 | 显示全部楼层
maybe it can only detect simple data type variables.
回复

使用道具 举报

 楼主| 发表于 2003-4-21 10:54:20 | 显示全部楼层
then shouldn't it have the error statement for "string" declaration?
回复

使用道具 举报

发表于 2003-4-21 10:59:25 | 显示全部楼层
who know, whenever i meet this, i simply remove it.
回复

使用道具 举报

发表于 2003-4-21 11:55:49 | 显示全部楼层
也许string是个class, 在C++中当一个类的对象被定义时,它需要执行构造函数,进行空间分配,初始化等一系列工作,在结束它的生存期时,要执行析构函数,进行空间的释放。而有些类做得比较极端,在构造函数河析构函数中已经完成了它需要做的工作,所以只要定义一个它的对象实例,它的工作就算完成了。因此一个局部对象的被定义时,在C++中就会把它看作已经引用过了,所以不会出现警告提示。
因此这样的没有警告的资源浪费更要注意才行啊!
回复

使用道具 举报

 楼主| 发表于 2003-4-21 12:05:33 | 显示全部楼层
多谢指教!!   
回复

使用道具 举报

发表于 2003-4-21 12:38:08 | 显示全部楼层
no no关键是 string本身是一个 reference 它的真正内容可能在本地可能来自外部
但是普通类型只会出现在本地的堆栈里 所以编译器会要求你尽量减少本地堆栈空间的占用
回复

使用道具 举报

发表于 2003-4-21 12:53:05 | 显示全部楼层
string定义的是一个实实在在的对象,不能说它是引用(reference),引用是简单变量或对象的别名,定义引用时,必须要指明它指向的原始变量或对象才行。(还要有&)
回复

使用道具 举报

发表于 2003-4-21 12:59:40 | 显示全部楼层
楼上 你可以看看你调试时候的内存 string给你的就是一个地址值 而不是一个内存块
回复

使用道具 举报

发表于 2003-4-21 13:15:53 | 显示全部楼层
但是你应该清楚定义string和定义string &的区别。
定义string要执行它的构造函数,而定义string &时是不执行构造函数的。
如果单凭string是一个地址值,就说他没有分配内存是错误的。
string对象在定义时,可能没有分配多余的用来储存字符串的内存,但是他分配了string对象的空间,这个空间当然是分配在堆上的,这也是我为什么要把简单变量和对象分的这么清楚的原因。
回复

使用道具 举报

 楼主| 发表于 2003-4-21 14:12:23 | 显示全部楼层
想不到我的小问题居然可以引起大家的讨论,心里真是很自豪!!!
我们就应该有这种氛围!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 02:58 , Processed in 0.092452 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表