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

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

代码默认模板


编译性高级编程语言中,几乎每种语言,都有个静态的 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://blog.51cto.com/7905648/1297255

.h.c 文件,在最后链接阶段,才会出现真正 联系

请参考

https://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.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();
    }
}
相关文章
|
1月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
95 10
|
28天前
|
开发框架 Java .NET
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
C#与Java
|
17天前
|
Java API Apache
WK
|
20天前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
17 1
|
25天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
21 5
|
26天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
30 6
|
1月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
在Java中处理JSON数据:Jackson与Gson库比较
|
1月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
16 1
|
1月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
61 1
WK
|
19天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
38 0