值传递的方式给函数参数传值//相当于Person p1 = p;
时间: 2024-09-09 17:15:03 浏览: 24
在许多编程语言中,当你将一个变量作为函数参数传递时,有几种基本的值传递方式:
1. **值传递**(Pass by Value):这是最常见的传递方式。函数接收到的是实参的一个副本,对这个副本的操作不会影响到原变量。例如,在Java中,如果你有一个`Person`对象`p1`,并将它传递给函数,函数内部创建了一个新的`Person`引用,改变这个新引用的属性并不会直接改变`p1`。
```java
void modifyCopy(Person p) {
p.setName("New Name"); // 这里修改的是复制的副本,不影响p1
}
Person p1 = new Person();
modifyCopy(p1); // 函数结束后,p1的name还是原始的
```
2. **引用传递**(Pass by Reference):这种情况下,函数接收的是实际变量的地址,所以如果函数改变了通过引用传递的参数,原变量的值也会受到影响。这通常发生在像C++这样的语言中,但Java等一些语言默认是值传递,需要明确指定为引用传递。
```cpp
void modifyReference(Person& p) { // 使用引用标记,表示修改的是实际对象
p.setName("New Name");
}
Person p1;
modifyReference(p1);
// 现在p1的name已经被修改了
```
相关问题
class Person { String name; int age; Person(this.name, this.age); static Map<String, Person> _nameCache = {}; factory Person.withNameFactory(String name, int age) { if (_nameCache.containsKey(name)) { return Person(name, age); } else { var person = Person(name, age); _nameCache[name] = person; return person; } } } void main() { var p1 = Person.withNameFactory('Alice', 25); var p2 = Person.withNameFactory('Alice', 25); var p3 = Person.withNameFactory('Bob', 30); print(p1 == p2); // true print(p1 == p3); // false } print(p1 == p2);的结果为啥是false
print(p1 == p2) 的结果为 false 是因为 p1 和 p2 引用的实际上是不同的对象,尽管它们具有相同的属性值。
在 `Person.withNameFactory` 工厂构造函数中,我们首先检查 `_nameCache` 中是否已经存在了指定名称的 `Person` 对象。如果存在,就直接返回 `_nameCache[name]`,这样就可以确保相同名称的 `Person` 对象在内存中只有一个实例。
在这个例子中,p1 和 p2 的名称都是 'Alice',但是它们实际上是两个不同的对象。这是因为 factory 构造函数每次都会创建一个新的 Person 对象,并将其存储在 `_nameCache` 中。因此,尽管 `p1` 和 `p2` 的属性值相同,但它们实际上是两个不同的对象,所以 `p1 == p2` 的结果为 false。
只有当 `p1` 和 `p2` 的引用指向相同的对象时,比较才会返回 true。
u16 zhankongbi=0; void Timer0_Init(void) //100微秒@12.000MHz { TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x9C; //设置定时初始值 TH0 = 0xFF; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //使能定时器0中断 EA=1; } void Timer0_Isr(void) interrupt 1 { TL0 = 0x9C; //设置定时初始值 TH0 = 0xFF; //设置定时初始值 temer0++; if(temer0<=zhankongbi){ P1=1; }else{ P1=0; // 10s 1.5 } if(temer0>=200) temer0=0;
这段代码是关于定时器0的初始化和中断处理函数的代码。在初始化函数Timer0_Init()中,首先设置了定时器模式为模式1,然后设置了定时器的初始值,TL0为0x9C,TH0为0xFF。接着清除了TF0标志位,并使能了定时器0中断和总中断。在中断处理函数Timer0_Isr()中,首先重新设置了定时器的初始值,然后每次进入中断都会对temer0进行递增操作。如果temer0小于等于zhankongbi的值,就将P1口置为高电平;否则将P1口置为低电平。最后,当temer0大于等于200时,将temer0重置为0。