构造函数详细总结

构造函数详细总结

一.构造函数的功能:在创建对象时初始化对象的实例变量;

  • 【注意事项】
    1.构造函数【与类具有相同的名字】,除了构造函数,其他的方法不能与类同名。
    2.构造函数【没有返回值】,也不能在前面加void修饰符
    3.如果类中没有定义构造函数,编译器会自动创建一个缺省的、不带参数的构造函数。
    【构造函数是在对象创建之后,new操作完成前被调用的。】
  • 二.this指代构造函数
  • 1.在一个类内部,一个构造函数可以调用另一个构造函数。
  • eg:
class point{
   int x,y;
    point(){ this(1,1);}
    point(int x,int y){this.x = x;this.y = y;}

2.在派生类中(即父子类中)用super调用构造函数
*(1). 构造函数是一种特殊的方法,子类不能继承超类的构造函数,

  • 但子类构造函数可以通过super调用超类的构造函数。
  • (2).当创建子类对象时,
  • 首先执行超类构造函数,然后执行子类的构造函数。例如:
class point{     
	  int x, y;  
	  point() { this(1,1);
	 System.out.println("无参构造函数被调用!");
	  }
	  point(int x, int y){ 
		  this.x=x; 	this.y=y;  
		  System.out.println("父类构造函数被调用!");   
	  }
}
	class circle extends point{
	   int radius;   
	   circle(int r, int x, int y){
		  super(); 	  
		  radius=r;
		  System.out.println("子类构造函数被调用!");   
	   }
	} 
public class testInherence {
    public static void main(String args[ ]) {
		circle     c1;
		c1=new circle(1,1,1);	
	}
} 
结果为:
父类构造函数被调用!
无参构造函数被调用!
子类构造函数被调用!

三.【子类构造函数(调用)(如果你不调用父类构造函数时则不须遵循这些规则)父类构造函数时】的设计原则
*1.若父类没有定义构造函数,则父类对象将用系统默认的构造函数初始化,
*子类可以随意设置构造函数。但子类先调用父类的默认构造函数,
*再调用自己的构造函数。

class point{  
 int   x,  y;    
 } 
class circle extends point{
   int radius;   
   circle(int r, int x, int y){
	   this.x=x;   this.y=y;     radius=r;
   }
   或者
    circle(){
	   x=1;   y=1;     radius=1;
   }
} 

*2.若父类定义了默认构造函数,则子类可以随意设置构造函数。
*(即调用默认构造函数或带参构造函数)

class point{  
  	int x, y;  
	point( ){  	  this(0,0);    }
  	point(int x, int y){    this.x=x; this.y=y;   }
} 
class circle extends point{  // 注意子类的构造函数
   	int radius;   
   	circle(int r, int x, int y){	  radius=r;  }
}class point{  
  	int x, y;  
	point( ){  	  this(0,0);    }
  	point(int x, int y){    this.x=x; this.y=y;   }
} 
class circle extends point{  // 注意子类的构造函数
   	int radius;   
   	circle(int r, int x, int y){	 
   	super(x,y) ;//显式调用父类的构造函数,这一行必须放在构造函数的第一行。
   	radius=r;  }
} 

3.若父类定义的构造函数都是有参的,子类必须通过super调用父类的带参构造函数。

class point{  
  private int x, y;    
  point(int x, int y){
      this.x=x;   this.y=y;  
  }
}
class circle extends point{
   int radius;   
   circle(int r, int x, int y){	  
	   super(x, y);
	   radius=r;
   }
}

<think>好的,用户想了解MFC中CRect构造函数的用法和示例代码。我需要先回忆一下CRect的相关知识,然后结合提供的引用资料来组织回答。 首先,CRect是MFC中用于表示矩形的类,继承自RECT结构。构造函数可能有几种不同的形式,比如空构造函数、用四个坐标初始化、用点和大小初始化等等。需要详细列出不同的构造函数形式,并给出每种情况的示例代码。 接下来,看看用户提供的引用中有没有相关的代码片段。引用[1]提到了MakeRect(ptDown, ptUp),可能涉及到CRect的构造,不过具体实现没有展示。引用[3]和[4]是关于数据交换和拖拽的,可能和CRect关系不大。因此,可能需要依靠自己的知识库来补充示例代码。 另外,用户可能需要知道如何正确使用这些构造函数,比如参数顺序,或者注意事项。比如,CRect的构造函数是否会自动规范化矩形(即调整left和right,top和bottom的顺序),这一点需要说明,避免用户在使用时出现错误。 还要考虑用户可能的实际应用场景,比如在绘图时创建矩形区域,或者在控件布局时定义位置和大小。因此,示例代码可能需要结合MFC的常见操作,比如在OnPaint中使用CRect来绘制矩形,或者在对话框布局中使用CRect来定位控件。 需要确保示例代码正确,比如使用正确的参数类型,比如POINT结构或CSize对象。同时,提醒用户注意参数的顺序,比如CRect(int l, int t, int r, int b)中的参数是左、上、右、下,而不是左、右、上、下。 可能还需要提到CRect的成员函数,比如Width()和Height(),但用户的问题主要是关于构造函数,所以这部分可以简要带过,或者放在示例中使用。 最后,生成的相关问题需要与CRect的其他用法或相关类有关,比如与CPoint、CSize的配合使用,或者与CDC绘图函数的结合,或者常见的错误处理。 总结一下,回答的结构应该是先介绍CRect的构造函数的不同形式,每种形式的说明和示例代码,然后使用注意事项,最后相关的问题。需要确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但可能在这个问题中数学公式较少,主要关注代码示例和文本说明。</think>### MFC中CRect构造函数使用说明 CRect是MFC中表示矩形的类,继承自Windows RECT结构。其构造函数支持多种初始化方式,以下是主要用法总结: --- #### 1. **空构造函数** 创建未初始化的矩形对象,需后续赋值: ```cpp CRect rect1; // left/top/right/bottom未初始化 ``` --- #### 2. **四整数构造** 通过左、上、右、下坐标初始化: ```cpp CRect rect2(10, 20, 200, 150); // left=10, top=20, right=200, bottom=150 ``` --- #### 3. **POINT构造** 通过两个对角点初始化矩形(自动规范化坐标): ```cpp CPoint pt1(30, 40); CPoint pt2(250, 180); CRect rect3(pt1, pt2); // 自动处理坐标顺序 ``` --- #### 4. **RECT结构构造** 从现有RECT结构复制数据: ```cpp RECT winRect = {50, 60, 300, 250}; CRect rect4(winRect); // 直接复制RECT成员 ``` --- #### 5. **位置+尺寸构造** 通过左、顶坐标和尺寸对象初始化: ```cpp CSize sz(150, 100); // 宽150,高100 CRect rect5(100, 50, sz); // right=100+150=250, bottom=50+100=150 ``` --- ### 关键特性说明 1. **自动规范化** CRect会自动调整坐标,确保`left <= right`且`top <= bottom`。例如: ```cpp CRect rect(200, 150, 100, 50); // 实际存储为(100,50,200,150) ``` 2. **成员访问** 可直接访问成员变量或通过方法获取尺寸: ```cpp int width = rect.Width(); // right - left int height = rect.Height(); // bottom - top ``` --- ### 应用示例(结合引用) 在绘图场景中创建矩形(参考引用[1]的绘图逻辑): ```cpp void CMyView::OnDraw(CDC* pDC) { CRect rectClient; GetClientRect(&rectClient); // 获取视图区域 CRect rectText(20, 30, 200, 100); pDC->DrawText(_T("MFC示例"), &rectText, DT_CENTER); // 反色绘制参考引用[1] pDC->SetROP2(R2_NOT); pDC->Rectangle(rectText); } ``` --- ### 注意事项 1. 坐标单位为**像素** 2. 与`CPoint`/`CSize`的算术运算支持: ```cpp CRect rect(0,0,100,100); rect += CPoint(10,20); // 整体偏移(10,20) rect.InflateRect(5,5); // 扩大5像素 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值