returnValue的含义及传递值

本文介绍如何使用IE特有的showModalDialog函数创建模式窗口,并通过window.returnValue属性从子窗口向父窗口传递不同类型的值,包括布尔值、整数及数组。

 

returnValuejavascripthtmlwindow对象的属性,目的是返回窗口值,当用
window.showModalDialog
函数打开一个IE的模式窗口(模式窗口知道吧,就是打开后不能操作父窗口,只能等模式窗口关闭时才能操作),用于返回窗口的值,下面举个例子:

//father.html
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio6.0">
<TITLE></TITLE>
<script language="javascript">
function showmodal(){
var ret =window.showModalDialog("child.htm",null,"dialogWidth:350px;dialogHeight:350px;help:no;status:no");
if (ret){alert('子窗口返回真
!');
}else{
alert('子窗口返回假
!');
}
}
</script>
</HEAD>
<BODY>
<INPUT id=button1 type=button value=Button name=button1onclick="showmodal();">
</BODY>
</HTML>

//child.html
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio6.0">
<TITLE></TITLE>
<script language="javascript">
function trans(tag){
if (tag==0){
window.returnValue=false;
} else{
window.returnValue =true;
}
window.close();

</script>
</HEAD>
<BODY>
<INPUT id=button1 type=button value="返回真
"name=button1 onclick="trans(1)">
<INPUT id=button2 type=button value="返回假
"name=button2 onclick="trans(0)">
</BODY>
</HTML>

  这样一来可以实现从模式窗口向父窗口传递值的作用,
  这个returnValue除了可以是布尔值,整型值等以外还可以是个js数组,用来传递大量数据

 

<think>好的,我现在要解释用户提供的这段C++代码:`Interger operator+(Interger itg) { return value += itg.value; }`。首先,我需要仔细分析每一部分的含义,确保自己理解正确,然后再组织语言让用户明白。 首先,用户可能打错了“Integer”为“Interger”,但代码中的类名是`Interger`,可能是个拼写错误或者用户自定义的类名。不过通常正确的拼写是“Integer”,所以可能需要指出这一点,但这里先按用户提供的名称来分析。 接下来,这个函数是一个成员函数,名为`operator+`,也就是重载了加法运算符。参数是另一个`Interger`对象`itg`。函数体内执行的是`return value += itg.value;`。这里可能存在几个问题需要理清。 首先,`value`应该是`Interger`类的成员变量,用来存储整数。但在这个成员函数中,直接访问了`itg.value`,这说明`value`成员可能是public的,或者这个函数是友元函数,但更常见的情况是,如果`value`是private,应该在类内部通过成员函数来访问,比如`getValue()`。不过这里可能用户简化了代码,假设`value`是public的。 然后,`return value += itg.value;`这一句。`+=`是一个复合赋运算符,它会将右侧的加到左侧的变量上,并返回左侧变量的引用。这里,`value`是当前对象的成员变量,所以这行代码实际上修改了当前对象的`value`,将其增加了`itg.value`的,然后返回修改后的`value`。但问题在于,这个函数的返回类型看起来是`Interger`,因为函数声明为`Interger operator+`,但`value`的类型可能是int或者其他整数类型。这会导致类型不匹配,因为`value += itg.value`的结果是`value`的类型,而函数的返回类型是`Interger`,所以这里可能存在问题。 比如,假设`value`是int类型,那么`value += itg.value`的结果是int,而函数应该返回`Interger`对象。所以正确的做法可能是创建一个新的`Interger`对象,而不是修改当前对象。例如,应该返回`Interger(this->value + itg.value)`,而不是修改当前对象的`value`并返回。否则,这样的运算符重载会改变当前对象的状态,而加法运算符通常不应该修改操作数,而是返回一个新的对象。 比如,通常正确的加法运算符重载应该是: Interger operator+(const Interger& itg) const { return Interger(value + itg.value); } 这样,当前对象和参数对象都不会被修改,而是创建一个新的对象,其`value`是两个对象`value`的和。 但用户提供的代码中,使用的是`return value += itg.value;`,这相当于修改了当前对象的`value`,并返回了修改后的。这会导致像`a + b`这样的表达式实际上修改了`a`的,这不符合加法运算符的常规语义。通常,`a + b`应该返回一个新,而不改变`a`或`b`。如果用户希望实现的是类似`a += b`的效果,应该重载`operator+=`,而不是`operator+`。 另外,函数的参数是`Interger itg`,这里使用了传的方式,可能会产生不必要的拷贝。通常建议使用常量引用,即`const Interger& itg`,以避免拷贝开销。 还有,函数返回的是`Interger`,但`value += itg.value`的结果是`value`的类型(比如int),所以这里可能存在隐式转换,假设`Interger`类有一个构造函数接受int参数,否则会导致编译错误。 总结问题点: 1. 可能的拼写错误:`Interger`应为`Integer`。 2. 运算符重载的语义错误:加法运算符不应修改当前对象。 3. 参数传递方式:应使用常量引用。 4. 返回类型和表达式类型不匹配:需要构造新的`Interger`对象。 5. 成员访问权限:假设`value`是public,否则需要访问器。 接下来,我需要将这些分析转化为用户容易理解的中文解释,分步骤说明代码的意图、存在的问题以及正确的做法。同时要保持口语化,避免技术术语过于密集,适当举例说明。</think>这是一个存在多个问题的C++运算符重载代码,让我们逐步分析: 1. **基础结构分析**: ```cpp Interger operator+(Interger itg) { return value += itg.value; } ``` - 这是为自定义的`Interger`类重载`+`运算符的成员函数 - 参数`itg`表示参与运算的另一个对象 - `value`应该是类的成员变量(存储整数) 2. **存在的主要问题**: - **错误1:语义错误** - `value += itg.value`会修改当前对象的成员变量 - 这导致`a + b`这样的表达式会意外改变`a`的 - 举例说明: ```cpp Interger x(5), y(3); Interger z = x + y; // 执行后x的会被修改为8! ``` - **错误2:参数传递方式** - 应该使用`const Interger&`避免拷贝: ```cpp Interger operator+(const Interger& itg) const ``` - **错误3:返回类型** - 表达式`value += itg.value`返回的是基本类型(如int) - 但函数声明返回`Interger`对象,需要显式构造 3. **正确实现方式**: ```cpp // 通过新对象返回计算结果 Integer operator+(const Integer& other) const { return Integer(value + other.value); } // 配套实现+=运算符 Integer& operator+=(const Integer& other) { value += other.value; return *this; } ``` 4. **其他注意事项**: - 类名建议更正为`Integer`(注意拼写) - 成员变量`value`如果是private需要提供访问方法 - 建议添加const修饰符保证对象不可变 **总结**:这段代码的本意是实现整数相加,但由于设计不当会导致对象状态被意外修改。正确的做法应该是创建新对象返回计算结果,修改当前对象的行为应该留给`+=`运算符实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值