.NET基础之构造函数
1.构造函数:
分为实例构造函数、静态构造函数、私有构造函数。
使用new表达式创建某个类的对象时,
1.1实例构造函数:
(1)构造函数的名字与类名相同;
(2)使用new表达式创建类的对象或者结构,会调用其构造函数。并且通常初始化新对象的数据成员;
(3)除非是静态的,否则会为没有构造函数的类,自动生成一个默认的构造函数,并使用默认值来初始化对象字段;
(4)构造函数可以有参数;
(5)构造函数可以以多态的形式存在多个构造函数;
(6)构造函数无返回值类型。
例:声明Test类,有三个构造函数
public class Test
{
int _aa, _bb; public Test()
{
_aa += ;
_bb += ;
Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
}
public Test (int value)
{
_aa += value;
_bb += value;
Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
}
public Test(int x,int y)
{
_aa += x;
_bb += y;
Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
}
}
测试如下:
static void Main()
{
Test test1 = new Test();
Test test2 = new Test();
Test test3 = new Test(, );
}
//Output:
//aa:10,bb:10
//aa:100,bb:100
//aa:1000,bb:1000
但是示例中的构造函数声明,有时会显得太罗嗦,尤其是当构造函数的功能相近时,可以改为如下的写法:
public class Practice
{
int _aa, _bb;
public Practice(int x,int y)
{
_aa += x;
_bb += y;
Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
}
public Practice(int value):this(value,value)
{
}
public Practice():this(,)
{ }
}
或者更进一步,可以改为如下的写法:
public class Play
{
int _aa, _bb;
public Play(int x=,int y=)
{
_aa += x;
_bb += y;
Console.WriteLine(string.Format("aa:{0},bb:{1}", _aa, _bb));
}
}
1.2静态构造函数
(1)静态构造函数不使用访问修饰符;
(2)静态构造函数不具有参数;
(3)在创建第一个实例或引用任何的静态成员之前,将自动调用静态构造函数实现初始化操作;
(4)不能直接调用静态构造函数;
(5)用户无法控制在程序中执行静态构造函数的时间;
(6)如果静态构造函数引发异常,运行时将不会再次调用该函数,并且类型在程序运行所在的应用程序域的生存期内将保持未初始化;
(7)静态构造函数可以和实例构造函数并存。
例:
public static int value = ;
Program()
{
value = ;
}
static Program()
{
value = ;
}
static void Main(string[] args)
{
Console.WriteLine(value); Program p = new Program();
Console.WriteLine(Program.value); Console.ReadLine();
}
打印结果为:(因为静态构造函数的调用会早于构造函数)
//output
1.3私有构造函数
私有构造函数是一种特殊的实例构造函数,通常用于包含静态构造成员的类中。如果类具有一个或多个私有构造函数而没有公共的构造函数,则其他类(除嵌套类外)无法创建该类的实例。
当没有实例字段或实例方法时或者当调用方法以获得类的实例时,私有构造函数可用于阻止创建类的实例。
1.4编写复制构造函数
class Person
{
private string name;
private int age; // Copy constructor.
public Person(Person previousPerson)
{
name = previousPerson.name;
age = previousPerson.age;
} //// Alternate copy contructor calls the instance constructor.
//public Person(Person previousPerson)
// : this(previousPerson.name, previousPerson.age)
//{
//} // Instance constructor.
public Person(string name, int age)
{
this.name = name;
this.age = age;
} // Get accessor.
public string Details
{
get
{
return name + " is " + age.ToString();
}
}
} class TestPerson
{
static void Main()
{
// Create a new person object.
Person person1 = new Person("George", ); // Create another new object, copying person1.
Person person2 = new Person(person1);
Console.WriteLine(person2.Details); // Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: George is 40
Demo地址:
https://download.csdn.net/download/u010312811/10337475
参考:
https://msdn.microsoft.com/zh-cn/library/k6sa6h87(v=vs.100).aspx
https://msdn.microsoft.com/zh-cn/library/kcfb85a6(v=vs.100).aspx
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=vs.100).aspx
https://www.cnblogs.com/cang12138/p/8297270.html
.NET基础之构造函数的更多相关文章
- Java基础八--构造函数
Java基础八--构造函数 一.子父类中构造函数的特点 1.1 为什么在子类构造对象时,发现,访问子类构造函数时,父类也运行了呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super( ...
- [ Java学习基础 ] Java构造函数
构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只 ...
- 黑马程序员——JAVA基础之构造函数,构造代码块
------- android培训.java培训.期待与您交流! ---------- 构造函数特点: 1. 函数名与类名相同 2. 不用定义返回值类型 3. 不可以写return语句 构造函数 ...
- 【C++基础】构造函数
说说你对构造函数的理解? 构造函数:对象创建时,利用特定的值构造对象(不是构造类),将对象初始化(保证数据成员有初始值),是类的一个public 函数 ① 与类同名 ② 无返回值 ③ 声明 ...
- c++基础语法 构造函数 析构函数 类的组合
1 构造函数 1.不能指定任何返回值,甚至连void都不能有. 2.与Java不同,c++不同new对象,对于无参的构造函数声明对象时括号应该省略. 2 析构函数 1. 前加~,不能有参数,不能有返回 ...
- [C++基础]在构造函数内部调用构造函数
看下面的面试题: #include <iostream> using namespace std; struct CLS { int m_i; CLS( int i ) : m_i(i){ ...
- JAVA_SE基础——29.构造函数
黑马程序员入学Blog... jvm创建Java对象时候需要调用构造器,默认是不带参数的.在构造器中,你可以让jvm帮你初始化一些参数或者执行一系列的动作. 它是对象创建中执行的函数,及第一个被执行的 ...
- JS基础(三)构造函数
JS中的构造函数 <script language="JavaScript"> window.onload = function(){ function Bottle( ...
- C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
知识点学习 类 const作用 C语言的const限定符的含义为"一个不能改变值的变量",C++的const限定符的含义为"一个有类型描述的常量": const ...
随机推荐
- 关于Ant脚本
在开发中,一个项目要经历单元测试l,集成测试,系统测试,测试过程中可能要不断修改代码,Ant脚本,通过一个xml文件,封装一系列繁琐又常用的操作,通过Ant指令执行xml脚本来批处理创建删除任务,编译 ...
- webpack 内存溢出 Allocation failed - JavaScript heap out of memory
项目中,当组件文件过多,webpack-dev-server 编译时,容易内存溢出, 在 \node_modules\.bin\webpack-dev-server.cmd 加以下红色配置,暂可解决 ...
- getservbyname和getservbyport
一.getservbyname函数原型 #include <netdb.h> struct servent *getservbyname(const char *servname, con ...
- 将.csv数据导入到mysql中
1.首先看一下我需要导入的数据: 用excel打开的时候显示: 用notepad++打开显示为: 2.使用notepad++打开改变字符集为UTF-8 3,建立表,表中的字段要和文件中的一致 3.执行 ...
- 使用js请求Servlet时的路径
项目结构如下: 全是web的html页面 js部分重要代码: function ajaxValidate() { var flag=false; $.ajax({ "url":&q ...
- mybatis-configxml样板
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC & ...
- C++向量 vector动态数组
需要包含头文件, #include <vector> using namespace std; vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所 ...
- es6写法
我们在日常开发中,如果我们使用es5则可以直接在浏览器里面写JavaScript脚本.一点问题也没有. 但是在写es6语法的JavaScript代码的时候,我们就需要引入babel翻译器了. 例如: ...
- ARM核心板_迅为4418核心板_高稳定超轻薄_研发超灵感
ARM核心板_迅为4418核心板_三星四核S5P4418处理器 4418核心板正面: 4418核心板反面:4418核心板尺寸图:详情了解:https://item.taobao.com/item.ht ...
- git查看某个文件的提交记录
git log --pretty=oneline 文件路径/文件名 git show 提交id