您的位置:首页 > 编程语言 > C#

C/C++、C#、JAVA(一):代码模板与库代码的引入

whuanle 2020-03-22 14:31 134 查看 https://www.cnblogs.com/whuanl

代码默认模板

编译性高级编程语言中,几乎每种语言,都有个静态的 main 方法作为程序启动入口,每种语言都有其编写规范。为了学习 C/C++、C#、JAVA四种语言,我们要先从默认代码模板中,慢慢摸索学习。

约定: 我们常常可以看到 函数、方法这两个词,很多人对此进行了混用。 方法,就是

void Test(){}
这样的形式; 函数,指具有确定命名的、并且可以通过名称调用的代码,属性、字段、方法、委托、事件等; 只要能够通过确定的名称调用(使用)的代码块,就是函数;而方法就是 返回值、名称、参数等组成的代码块;

C/C++、Java 主要是 驼峰命名(Camel-Case), C# 是Pascal 规则(帕斯卡命名)。 文章代码和示例比较多,对于命名这方面,可能不会严格按照此语言的规范编写。(主要是笔者习惯写C#)

代码模板

C

#include <stdio.h>

int main()
{
/* 代码 */
return 0;
}

C++

#include <iostream>
using namespace std;

int main()
{
/* 代码 */
return 0;
}

C#

using System;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
/* 代码 */
}
}
}

JAVA

package com.company;
import com.company.test.*;

public class Main {

public static void main(String[] args) {
Test test = new Test();
}
}

C# 和 Java 的

main
方法都是静态入口。 C# 的
main
方法是大写,其余语言都是小写。

库代码的引入和解析

每种编程语言中,例如 sdk 等都会有大量丰富的官方库代码已经自定义库代码,那么,我们应该如何引入使用呢?

C

C语言 源文件以

.c
.h
结尾,一般
.h
用来定义成员,
.c
用来实现成员。
.c
称为源文件,
.h
称为头文件。

C语言中,使用

#include "{文件名称}.{.c|.h}"
#include <{文件名称}.{.c|.h}>
来使用系统或自定义的库代码。 简单来说,
#include <>
是使用系统自带的代码,
#include ""
是使用你自己写的代码或第三方代码。 请参考 http://c.biancheng.net/view/443.html

写代码和编译时,

.c
.h
文件和里面的代码没有任何联系。

C语言 中没有接口(面向对象),因此考虑到解耦,将函数的定义和实现两个部分分开,

.h
文件定义外界可以访问使用的成员,以及如何调用成员。
.c
实现
.h
中声明名的成员。

那么,如何使用

.h
.c
声明和实现函数,并且能给外部使用呢?

实现
.h
.c
以及外部调用

编写一个

Test.h
文件。 此文件声明了一个
getA
方法,不需要输入参数,会返回一个 int 类型的值。 extern 关键字,声明了此方法能够被外部调用。

#include <stdio.h>

extern int getA(void);

我们在 main 方法中,使用此方法

#include <stdio.h>
#include "Test.h"

int main() {
int a = getA();
printf("%d",a);
return 0;
}

然后来实现

Test.c

#include <stdio.h>

// 实现 getA方法
int getA(void) {
return 666;
}

以上代码就是

.h
.c
文件的编写方法以及提供外部调用。

.h
.c
文件

前面我说了,

.h
、和
.c
文件,没有必然联系。下面我来解释一下。

因为

.h
.c
不像 C#、JAVA 中的 接口和继承,没有强制规定,因此可以只写
.h
,或只写
.c
.h
也可以实现代码,例如
Test.h
文件

#include <stdio.h>
extern int getA(void) {
return 666;
}

C语言的编译,经历预处理/预编译、编译、汇编、链接四个步骤。 预处理/预处理(Preprocessing):条件编译、宏定义处理等 编译(Compilation): 检查语法,生成汇编 汇编(Assemble):汇编代码转换机器码 链接(Linking):与其它组件组合起来生成可执行文件 资料参考 http://c.biancheng.net/view/1736.html

https://www.geek-share.com/detail/2590170698.html

.h
.c
文件,在最后链接阶段,才会出现真正
联系
。 请参考 https://www.geek-share.com/detail/2544082340.html

C++

据说 C++ 之父 Bjarne Stroustrup 博士,都没有搞懂 C++ 这种编程。

C++ 源文件后缀为

.cpp

C++ 中,我们看到了

#include <iostream>
,为啥不带
.h
.c
? C++ 是 C语言 的超集,C++ 实现了面向对象,C++ 出现了命名空间和库的概念。 在 C++ 中,
#include <stdio.h>
是一般的头文件引用方式;而
#include <iostream>
是 C++ 库的引用方式。引用的是
标准库

C++ 标准库分为两部分:

标准函数库: 继承C语言,由不属于类的函数组成。 面向对象类库: 类及其相关函数的集合。

命名空间

前面我们看到了 C++ 代码模板中,还有

using namespace std;
,这一句是引用命名空间。

在 c++ 中,也可以直接实现

.h
声明的 函数,但是这样跟不能体会到 面向对象 的优势。

C++ 使用面向对象,采用 命名空间-类-成员实现 的机构,来编写代码,示例如下。 编写 Test.h

namespace first_space {
int func();
}

编写 Test.c

namespace first_space {
int func() {
return 666;
}
}

main 函数中调用

#include <iostream>
#include "Test.h"

using namespace std;
using namespace first_space;

int main()
{
int a = func();		// first_space
cout << a << endl;
return 0;
}

可以看到,命名空间只是多了个范围限定。 在 C++ 中,函数可以定义在类中,命名空间中,也可以直接写在 源文件中。

C#

C# 是笔者最喜欢的语言,嘿嘿嘿。 C# 中类库编译后,是一个

.dll
文件。

以下是 C# 命名空间和引用命名空间的示例。

namespace ConsoleApp1
{
using Test;
class Program
{
static void Main(string[] args)
{
T666 t = new T666();
t.Test();
}
}
}
namespace Test
{
public class T666
{
public void Test(){}
}
}

C# 中,命名空间没有严格要求。 一般,命名空间以

[项目名称].[目录名称].[目录名称]...
组成。 以项目名称开头,后面每个子目录名称组成。 例如要实现用户身份认证的功能,将这部分代码放到
MyProj/Auth
目录中,那么命名空间就是
MyProj.Auth
。 C# 的源文件以
.cs
结尾,一般来说,一个独立功能的类或接口,使用一个
.cs
文件。 但 C# 中,并不强制要求。这些慢慢学习 C# 时会学习了解到。很大程度上跟 C++ 的命名空间相似。

C# 中以命名空间作为限定范围,对类进行使用。 调用的最小粒度为类、结构体、枚举等。 所有的字段、属性、方法等必须在类中定义和实现。 C# 引入一个命名空间后,便能使用此命名空间的所有的类。

Java

Java 的规则还是比较多的。 Java 的源文件,以

.java
结尾。 每个
.java
文件中,只能有一个 public 类,并且类名称必须跟
.java
文件的名称相同。 Java 中,没有命名空间,而是以包的形式来调用,包名引用严格以目录名称设置。

Java 中,使用

import
关键字来引入包,例如
import java.io.*;
。 有两种引用形式,一种是引用具体的类名

import  java.io.PrintStream;

之后便可以使用 PrintStream 类。 另一种是使用

import java.io.*;
,可以使用此包下所有的类。

Java 中,标准库以

java.
javax.
开头。

如果想将编写的类提供给外部使用,则要使用

package
关键字。

以下为一个示例.

程序目录结构如下

.
│  main
│
└─com
└─company
│  Main.java
│  MyFrame.java
│
└─test
Test.java
Test2.java

编写两个类,Test,Test2,

# Test
package com.company.test;

public class Test {
public void My() {
Test2 t = new Test2();
}
}

# Test2
package com.company.test;

public class Test2 {
}

main 函数中调用调用

package com.company;
import com.company.test.*;

public class Main {
public static void main(String[] args) {
Test test = new Test();
}
}
标签: