函数声明方式及构造函数

本文介绍了JavaScript中的函数声明和函数表达式,包括函数声明的提升和函数表达式的变量提升。提到了newFunction构造函数的用途,并通过示例展示了如何使用构造函数创建对象。此外,还讲解了函数Fn的实例化过程。

一、函数声明方式

1.声明式

函数声明提升,会将函数声明提到函数所在作用域开头,整个作用域内都可使用。

function fn(){}

2.函数表达式

只能在该作用域内,该代码执行后才能调用函数,会变量提升,将fn提升至作用域开头,代码执行前调用结果为 fn==undefined。

let fn = function(){}

3.构造函数 new Function

用来初始化对象,

常用的构造函数: 

    1.    var arr = [];     为      var arr = new Array();       的语法糖。

    2.    var obj = {}     为      var obj = new Object();     的语法糖

    3. var  date = new Date();

function Fn(name,age){

    this.name = name

    this.age = age

}

let fn1 = new Fn('张灿','18')      //  fn1={name:'张灿',age:'18'}

<think>我们正在讨论类的构造函数声明。根据引用内容,构造函数是类的特殊成员函数,用于初始化对象的数据成员。构造函数的名字与类名相同,没有返回类型(包括void)。构造函数可以重载,即可以有多个构造函数,只要它们的参数列表不同。 引用[1]展示了Kotlin中的主构造函数声明,但在C++中,构造函数声明方式有所不同。引用[2]和[3]是C++的示例。 在C++中,构造函数声明通常放在类的内部(通常在public部分),而定义可以在类内部(内联)或外部。 下面是一个C++类构造函数声明和定义示例: ```cpp class Date { public: // 1. 默认构造函数(无参数) Date(); // 2. 带参数的构造函数 Date(int y, int m, int d); // 3. 复制构造函数(参数为同类型的const引用) Date(const Date& other); private: int year; int month; int day; }; // 在类外部定义构造函数 Date::Date() : year(0), month(1), day(1) { } Date::Date(int y, int m, int d) : year(y), month(m), day(d) { } Date::Date(const Date& other) : year(other.year), month(other.month), day(other.day) { } ``` 关键点: 1. **默认构造函数**:没有参数,或者所有参数都有默认值。如果类中没有定义任何构造函数,编译器会生成一个默认构造函数(但如果我们定义了带参数的构造函数,编译器就不会自动生成默认构造函数,这时如果需要默认构造,必须显式定义,如引用[3]所示)。 2. **带参数的构造函数**:用于在创建对象时提供初始值。可以使用初始化列表(如上)或函数体内赋值(但初始化列表更高效)。 3. **复制构造函数**:参数为同类型对象的const引用,用于通过已有对象初始化新对象。 注意:构造函数不能被显式调用(在对象创建时自动调用),且没有返回值。 引用[3]提到,如果类提供了非默认构造函数(比如带参数的构造函数),那么编译器就不会自动生成默认构造函数,这时如果我们需要使用默认构造,就必须自己定义。否则,像`Date d1;`这样的语句会导致编译错误。 另外,引用[1]中Kotlin的示例展示了另一种语言的主构造函数特性,但我们现在聚焦于C++。 在C++11之后,还支持委托构造函数和移动构造函数等。 下面是一个使用委托构造函数的例子: ```cpp class Date { public: // 委托构造函数:调用另一个构造函数 Date() : Date(0,1,1) { } Date(int y, int m, int d) : year(y), month(m), day(d) { } // ... 其他成员 }; ``` 以上介绍了C++中构造函数声明的基本形式。接下来,我们根据要求生成相关问题。 </think>### 类的构造函数声明详解 构造函数是类的特殊成员函数,用于在创建对象时初始化对象的数据成员。以下是关键知识点: #### 1. **基本声明规则** - **名称要求**:必须与类名完全相同 - **无返回值**:不能指定返回类型(包括`void`) - **可重载**:支持声明多个参数不同的构造函数 ```cpp class Student { public: // 默认构造函数(无参数) Student(); // 带参构造函数 Student(string name, int age); // 复制构造函数 Student(const Student& other); }; ``` #### 2. **构造函数类型** | 类型 | 声明示例 | 作用 | 调用场景 | |-------------------|-----------------------------------|------------------------------|----------------------------| | **默认构造函数** | `Student();` | 初始化对象为默认值 | `Student s;` | | **参数化构造函数**| `Student(string n, int a);` | 根据参数初始化 | `Student s("Tom", 18);` | | **复制构造函数** | `Student(const Student& other);` | 用已有对象初始化新对象 | `Student s2 = s1;` | #### 3. **声明注意事项 **① 默认构造函数必要性** 当类提供带参构造函数时,编译器**不再自动生成**默认构造函数。如需无参构造,必须显式声明: ```cpp class Date { public: Date(int y, int m, int d); // 带参构造[^3] Date(); // 必须显式声明默认构造 }; ``` 否则`Date d;`会编译报错[^3]。 **② 初始化列表推荐** 优先使用成员初始化列表(效率更高): ```cpp Student::Student(string n, int a) : name(n), age(a) { } // ✅ 初始化列表 ``` **③ 特殊语法(Kotlin示例)** 某些语言如Kotlin支持主构造函数简写: ```kotlin // 主构造函数中直接声明属性 class Student(val name: String, var age: Int)[^1] ``` #### 4. **声明位置规范** - **公有声明**:构造函数通常声明在`public`区域 - **头文件声明**:在`.h`头文件中声明接口 - **源文件定义**:在`.cpp`源文件中实现具体逻辑 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值