首页 > 编程语言 >C与C++在函数和数据的比较

C与C++在函数和数据的比较

时间:2024-04-13 19:13:52浏览次数:19  
标签:__ 函数 double C++ complex 数据 class 构造函数

C与C++在函数和数据的比较

C

Data(struct)

数据是一个类型 -> 根据数据的类型创建出真正的数据

Function

函数就是用来处理数据的

缺陷:

语言没提供关键字.所以数据是全局的 -> 各个函数都可以处理数据

C++

Data

将数据和处理这些数据的函数包裹在一起,其他函数看不到其他函数处理的数据

Function

将来以class为一个object创建对象

C++ programs代码的基本形式

.h -> .cpp -> .h(Standard Library)

自己写的头文件引入的时候用双引号""

标准库的头文件引入的时候使用尖括号<>

头文件中防卫式声明

#pragma once
/*
无指针的类,单一的类,不和其他类有关联的
*/
#ifndef __COMPLEX__ // guard 防卫式声明 -> 不要有重复的include动作
#define __COMPLEX__



#endif // __COMPLEX__

Header头文件布局

  • 0 -> 前置声明(forward declarations)

  • 1 -> 类声明(class declarations)

  • 2 -> 类定义(class definition)

示例代码:

#pragma once
/*
无指针的类,单一的类,不和其他类有关联的
*/
#ifndef __COMPLEX__ // guard 防卫式声明 -> 不要有重复的include动作
#define __COMPLEX__

/*
class head
class body
body内函数
body外函数
*/
class complex // class head
{
public:
complex (double r = 0, double i = 0)
: re(r), im(i) { }

complex& operator += (const complex&); // 这是函数声明,没有定义内容
double real() const { return re; } // 直接定义了函数
double imag() const { return im; }

private:
// 实部虚部类型
double re, im;

friend complex& __doapl(complex*, const complex&);
};

#endif // __COMPLEX__

C++类型模板

如果需要声明一个复数类型是float那么有99%的代码会是重复的,那么这个时候就引入了C++模板的概念 -> typename T

示例代码:

#pragma once
/*
无指针的类,单一的类,不和其他类有关联的
*/
#ifndef __COMPLEX__ // guard 防卫式声明 -> 不要有重复的include动作
#define __COMPLEX__

/*
class head
class body
body内函数
body外函数
*/
template<typename T> // 具体使用的时候才指明类型
class complex // class head
{
public:
complex (double r = 0, double i = 0)
: re(r), im(i) { } // 构造函数

complex& operator += (const complex&);
double real() const { return re; } // inline function
double imag() const { return im; }

private:
// 实部虚部类型
T re, im;

friend complex& __doapl(complex*, const complex&);
};

#endif // __COMPLEX__
{
   complex<double> c1(2.5, 1.5);
   complex<int> c2(2, 6);
   // 这两个使用的T类型不一样,一个是double类型,一个是int类型
}
inline(内联)函数

函数在class内定义就是inline*

如果函数太复杂,则没有办法inline

是否真的变成inline由编译器决定

access level(访问级别)

public为外界可以看到

private为内部可以看到,外部看不到 -> 数据部分内部看到

所有的数据都应该声明为private

constructor(构造函数)

构造函数示例:

complex (double r = 0, double i = 0)
: re(r), im(i) { }

这就是一个构造函数,默认参数为(0, 0),他会给reim两个部分赋值

构造函数的特点:

构造函数名称一定要和类的名称相同

构造函数不需要有返回类型

对于构造函数的辅助应该使用构造函数的特有语法 -> 初始化、初值列 -> 不要再构造函数体内进行赋值

示例代码:

complex (double r = 0, double i = 0) : re (r), im (i) { } // 这就是初始化、初值列
complex (double r = 0, double i = 0) { re = r; im = i; } // 这就不太好

结果虽然相同但是在赋值阶段的时间点不同

构造函数的重载(overloading)

以构造函数举例是因为构造函数必须和类名相同

函数重载是指同一个类的不同构造方式由函数创作者决定.这三种构造方式的函数名称都是相同的,这个就是函数的重载

构造函数私有化(单例设计模式)

示例代码:

#pragma once

#ifndef __SINGLETON__
#define __SINGLETON__

class A
{
public:
static A& getInstance();
setup() {}

private:
A();
A(const A& rhs);

};

A& A::getInstance()
{
static A a;
return a;
}

#endif // !__SINGLETON__

const member functions (常量成员函数)

class当中不会改变数据的函数需要在{}前加上const -> 表示不改变里面数据的内容

参数传递

  • pass by value -> 整包传递(value多大都传过去 -> 压到栈空间进行传递)

  • pass by reference(引用) -> 传引用就相当于传指针 -> 很快.但是形式很漂亮

尽量不要pass by value -> c当中可以传递指针 -> 最好所有的参数传递都传引用

需要注意传递字符的时候

如果需要传递引用并且希望对方不能修改内容,加入不可变关键字const -> 如果对方改了编译就会出错

返回值传递

  • return by value

  • return by reference(to const)

返回值传递也尽量by reference

friend(友元)

friend可以取到private变量

相同class的各个object互为friends(友元)

同一个class构成的对象互为friend所以可以直接调用另一个class里面的private变量

class complex
{
   public:
  complex (double r 0, double i = 0) : re(r), im(i) { }
   
   int func(const complex& param) { return param.re + param.im; }
};

{
   complex c1(2, 1);
   complex c2;
   
   c2.func(c1); // c1、c2互为友元因为c1和c2是同一个class出来的object
}

什么情况下不能够return by reference:

示例代码:

#include <iosteam>

int main()
{
   // 下面的add方法当中就不能够传指针(引用),因为出了函数以后的作用域声明的result就被销毁了.
}

int add(int a, int b)
{
   int result = a + b;
   return result;
}
 

标签:__,函数,double,C++,complex,数据,class,构造函数
From: https://www.cnblogs.com/JunkingBoy/p/18133211

相关文章

  • 16、数据库加固-mysql 加固
    1.修改DBA登录密码shell下执行:mysqladmin-urootpassword非首次修改:mysqladmin-urootpassword-p原密码在mysql下执行:updateusersetpassword=password('密码')whereuser='root';flushprivileges;2.删除默认数据库和用户删除测试库showdatabases......
  • 16、数据库加固-mongo 加固
    1.指定日志与数据库存放位置在配置文件中设置指向目录位置自建配置文件:vim/usr/local/mongodb/etc/mongodb.confdbpath=/data/dblogpath=/usr/local/mongodb/logs/mongdb.log2.更改默认端口自建配置文件:vim/usr/local/mongodb/etc/mongodb.confport=28888开......
  • 15、数据库加固-redis 加固
    1.禁止网络访问Redis服务更改配置文件,使服务监听本地回环地址修改redis配置文件:vi安装路径/redis.conf确保:bind127.0.0.1(::1:表示ipv6回环地址)2.设置防火墙过滤浏览(与禁止网络访问相对应,两者设置一种即可)设置iptables防火墙,确保访问源安全允许某源地址访问服务器的......
  • [Java SE] 经典问题:超出Java Long型(8字节/64位)的二进制比特流数据如何进行大数的数
    0问题描述经典问题:超出JavaLong型(8字节/64位)的二进制比特流数据如何进行大数的数值计算?近期工作上遇到了这个问题:需要将一个无符号数、且位长>=8字节(等于8字节时,首位bit为1,其他bit不全为0)的二进制字符串转为Java****对象(原始整数),进行整型运算、或浮点数运算浮点运算......
  • 数据结构-树
    数据结构-树1.定义:树是一种分层数据结构,由节点组成。每棵树有一个根节点,每个节点除了根节点外都恰有一个父节点,并可能有多个子节点。它是一种非线性数据结构,用于表示具有层级关系的数据。classTreeNode:def__init__(self,data):self.data=datasel......
  • 数据结构-图
    数据结构-图1.定义:图是一种由节点(或称为顶点)和连接这些节点的边组成的数据结构。图可以用来表示任何二元关系,比如路线、网络、状态转换等。在Python中,可以使用邻接表或邻接矩阵来表示图classGraph:def__init__(self):self.graph={}2.类型:图分为有向......
  • 数据结构-队列
    数据结构-队列1.定义:队列是一种遵循先进先出(FIFO,FirstInFirstOut)原则的线性数据结构。在队列中,元素从一端添加(队尾),从另一端移除(队头)。classQueue:def__init__(self):self.items=[]主要操作:队列的主要操作包括enqueue(向队尾添加元素)、dequeue(从队头......
  • Python通过函数名调用函数的几种场景
    除了执行系统命令外,我们有时还需要动态地执行一些python代码,有经验的朋友就会知道可以使用内置函数eval实现这一需求,如eval("print(__file__)"),这还是比较简单的。但如果要动态执行一个函数,讲的资料就会少一点,这次就要看这个需求该如何实现。一、通过eval实现1通过eval调用同......
  • 数据结构-栈
    数据结构-栈1.定义:栈是一种只能在一端进行插入和删除操作的线性数据结构。它遵循后进先出(LIFO,LastInFirstOut)的原则,即最后插入的元素将是第一个被移除的classStack:def__init__(self):self.items=[]defis_empty(self):returnself.ite......
  • 数据结构-堆
    数据结构-堆1.定义:堆是一种特殊的完全二叉树。在堆中,所有的父节点都满足特定的顺序关系(大于或小于)与它们的子节点。这种属性使得堆在处理优先级队列和排序操作时非常有效。2.类型:常见的两种类型的堆是最大堆和最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;而在......