20250127_C++高级编程

对象初始化

  • 1 类的4个常见的构造函数

    • 1.1 类对象初始化的3个函数
      • 1.1.1 默认构造函数

        FunctionClass(int data = 10) :m_data(data)
        {
          cout << "FunctionClass(int)" << endl;  
        }
        
      • 1.1.2 拷贝构造函数

        FunctionClass::FunctionClass(const FunctionClass& other)
        {
          m_data = other.m_data;
        }
        // 当有新对象生成时,调用拷贝构造函数。
        
      • 1.1.3 函数运算符重载(= 赋值运算符)

        FunctionClass& FunctionClass::operator=(const FunctionClass& other)
        {
         // TODO: 在此处插入 return 语句
         m_data = other.m_data;
         return *this;
        }
        // 当没有新对象生成时,调用赋值函数
        // 当使用临时对象为已有对象赋值时,先创建临时对象,再为已有对象赋值。
        

  • 2 编码实践

    	    FunctionClass f1; // 创建FunctionClass类的对象 f1
          FunctionClass f2(); //声明一个函数f2, 其返回对象类型为 FunctionClass
    

静态数组, 动态数组, 指针数组, 数组指针

      • 静态数组
    // 创建一个对象数组,其大小为2,会分别执行5次构造函数和析构函数。
    // 静态对象数组:数组和其中的对象,都存储在栈内存(stack)中
        FunctionClass f_array[2]; 
    

File

      • 动态数组
	// 创建一个FunctionClass类型的指针,指向1个临时数组,数组中存储有2个临时对象,存储在堆上,程序退出时,不会调用析构函数。
   // 动态对象数组,数组和其中的对象都存储在堆内存(heap)中。
   FunctionClass* f_array_2 = new FunctionClass[2]; 
   //delete f_array_2; // 错误,f_array_2 是一个指向数组的指针。
   delete[] f_array_2;
~~~

- - - **指针数组**
```C++
	// 指针数组, 指针数组是局部变量,存储在栈内存中,指针数组中的元素存储在堆内存中,需要显式删除。
   // 数组指针,指向一个数组的指针
   FunctionClass* f_array3[2]; // 定义一个指针数组,其元素为指针
   for ( int  i = 0; i < 2; i++)
   {
   	f_array3[i] = new FunctionClass();
   }

   for (int i = 0; i < 2; i++)
   {
   	delete f_array3[i];
   }

File002


函数参数

  • 形参 形参是函数定义时使用的参数,它们充当函数的局部变量,用于接收调用函数时传递的值。形参在函数定义时声明。

  • 实参 实参是函数调用时传递给函数的实际参数。它们是函数调用时传递给形参的值或引用。实参的类型和个数应与形参相匹配。

  • 按值传递(pass-by-value):将实参的值传递给形参,形参是实参的副本,函数内部对形参的修改不会影响实参。

  • 按引用传递(pass-by-reference):将实参的引用传递给形参,函数内部修改形参会影响实参。

  • 按指针传递(pass-by-pointer):通过指针将实参的地址传递给形参,函数可以通过指针修改实参。

// 按值传递(pass-by-value):将实参的值传递给形参,形参是实参的副本,函数内部对形参的修改不会影响实参。
FunctionClass get_object1(FunctionClass other)
{
	int data = other.get_data();
	FunctionClass tmp(data);
	return tmp;
}

	FunctionClass f3;
	FunctionClass f4;
	f4 = get_object1(f3);
~~~
![File005](file005.png)


```C++
//按引用传递(pass - by - reference):将实参的引用传递给形参,函数内部修改形参会影响实参。
FunctionClass get_object2(FunctionClass& other)
{
	int data = other.get_data();
	return FunctionClass(data);
}

	FunctionClass f5;
	FunctionClass f6;
	f6 = get_object2(f5);
  • 声明对象是指告诉编译器该对象的名字和类型,但并不为该对象分配内存。声明对象通常出现在头文件中,或者在函数外部进行作用域声明。声明对象不会创建对象的实例,也不为对象分配内存空间。
  • 定义对象是指创建对象的实例,并为其分配内存。定义对象不仅仅是声明对象,还包括为该对象分配内存,初始化对象的成员变量,以及执行对象的构造函数(如果有的话)。定义对象通常出现在源文件中(.cpp 文件)。
posted @ 2025-01-27 13:43  胡梅尔斯  阅读(20)  评论(0)    收藏  举报