c++ 有用 const 结尾 的函数,C#中是否没有了

问题描述

c++中类的函数有const结尾的,如下:表示该函数为只读,不会修改类本身成员数据。c#中就没有了。classCGeMatrix3d{public:CGeMatrix3d&invert();CGeMatrix3dinverse()const;private:intm_iInfo;}如上,上面2个函数其实功能一样的,都是求解逆矩阵。只是一个把自身给逆了(invert函数)。另外一个自身不变,但返回新产生的逆矩阵(inverse函数)。这样很好啊,//为什么c#中就只能写成classCGeMatrix3d{public:CGeMatrix3dinvert();CGeMatrix3dinverse();private:intm_iInfo;}这样的话,调用者都无法知道哪个函数会改变自身,哪个不会。有没有办法

解决方案

本帖最后由 genguo 于 2016-03-21 09:24:13 编辑
解决方案二:
函数自身不变?有这种说法吗?你可以参考C#中的ref,out关键字
解决方案三:
楼上估计没写过c++程序,c++中就可定义函数为只读的。明确表明了该函数的调用不会影响类本身。
解决方案四:
引用2楼genguo的回复:

楼上估计没写过c++程序,c++中就可定义函数为只读的。明确表明了该函数的调用不会影响类本身。

我是没写过C++,不过你看看ref和out应该就能明白了
解决方案五:
引用3楼andywangguanxi的回复:

Quote: 引用2楼genguo的回复:
楼上估计没写过c++程序,c++中就可定义函数为只读的。明确表明了该函数的调用不会影响类本身。

我是没写过C++,不过你看看ref和out应该就能明白了

很大区别的。。。const写在类函数声明的后面表示这个函数不能对类成员进行修改这个功能我没在C#中看到过,估计是没有了
解决方案六:
引用4楼u012948520的回复:

很大区别的。。。const写在类函数声明的后面表示这个函数不能对类成员进行修改这个功能我没在C#中看到过,估计是没有了

是没看到过,不好意思
解决方案七:
如上,上面2个函数其实功能一样的,都是求解逆矩阵。只是一个把自身给逆了(invert函数)。另外一个自身不变,但返回新产生的逆矩阵(inverse函数)。这样很好啊这个在C#中应该是没有通过一个关键字(比如C++的const)就能实现象上面你举的这个例子,只能分别实现了,比如这个不需要自身改变的,可以深度克隆一个新的矩阵,对其做逆序返回
解决方案八:
C#没有CGeMatrix3d&invert();这种语法。C#很多函数如果要修改自身的话,会返回一个新的对象。
解决方案九:
这种成员方法在.NET中叫“纯方法”,可以为方法加上PureAttribute特性(需要4.0以上版本的框架)。参见https://msdn.microsoft.com/zh-cn/library/system.diagnostics.contracts.pureattribute(v=vs.110).aspx
解决方案十:
其实这个问题本身不是实现问题,如何用c#实现我也知道。而是涉及代码可读性问题。c#中如果我不说哪个函数是返回自身,哪个是新克隆的。CGeMatrix3dinvert();CGeMatrix3dinverse();这两个函数你能区分出哪个是哪个吗。如果函数末尾能加const,就能明确知道哪个是哪个了。外加上上良好的函数名称的命名。就能有很好的可读性
解决方案十一:
既然是不改变当前实例的状态,那直接写个静态方法不就完事了,这种事多得很Object.Eqeals(),不就有成员方法和实例方法吗?只不过你那个事构造函数,特殊一点罢了,invert()本来就应该作为实例方法,构造函数就应该只干构造函数的事情从来不以为少写个方法调用,代码就会变得高明,反而只会让人看不懂
解决方案十二:
刚看了下MSDN,那个PureAttribute编译器没有作强制检查,只是一个辅助性的标识,给调用者看的
解决方案十三:
引用9楼genguo的回复:

其实这个问题本身不是实现问题,如何用c#实现我也知道。而是涉及代码可读性问题。c#中如果我不说哪个函数是返回自身,哪个是新克隆的。CGeMatrix3dinvert();CGeMatrix3dinverse();这两个函数你能区分出哪个是哪个吗。如果函数末尾能加const,就能明确知道哪个是哪个了。外加上上良好的函数名称的命名。就能有很好的可读性

仔细想想,c++的“CGeMatrix3dinverse()const;”只是告诉你这个接口不会修改成员你也不能一眼看出它返回的是不是克隆,而是需要以自己的经验才能判断所以良好的文档才是正确的解决方案
解决方案十四:
引用12楼shingoscar的回复:

Quote: 引用9楼genguo的回复:
其实这个问题本身不是实现问题,如何用c#实现我也知道。而是涉及代码可读性问题。c#中如果我不说哪个函数是返回自身,哪个是新克隆的。CGeMatrix3dinvert();CGeMatrix3dinverse();这两个函数你能区分出哪个是哪个吗。如果函数末尾能加const,就能明确知道哪个是哪个了。外加上上良好的函数名称的命名。就能有很好的可读性

仔细想想,c++的“CGeMatrix3dinverse()const;”只是告诉你这个接口不会修改成员你也不能一眼看出它返回的是不是克隆,而是需要以自己的经验才能判断所以良好的文档才是正确的解决方案

c#在避免c++的复杂性。c#里面const不能修饰一个对象。c++却可以用来修饰指针。还可以修饰方法。如果一个类只有私有字段,那么这些私有字段是不应该对外开放的。也就是说其他类不知道这些私有字段的存在。你现在在一个方法后面加上const声明,表明此方法不会修改这些私有字段。这样的意义何在?有没有私有字段,调用类都不在乎,还在乎你修改私有字段吗?明显把内部实现暴露给了外部类。所以不要这个功能是正确的。

时间: 2024-10-02 01:22:04

c++ 有用 const 结尾 的函数,C#中是否没有了的相关文章

新手求解答一下-const求解catch函数中const的作用

问题描述 const求解catch函数中const的作用 try{.......throw i;} catch(const int i)中const的作用是什么具体是什么 解决方案 const int i 这里不允许修改i.

C++函数参数中引用和指针有什么区别?

问题描述 C++函数参数中引用和指针有什么区别? C++函数参数中引用和指针有什么区别? 解决方案 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址: 引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需要解引用: 3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" ^_^ 4. 引用没有 const,指针有 const,const 的指针不可变: 5. 引用不能

opengl-OpenGL无法解析的外部符号 __iob,该符号在函数 _fgError 中被引用

问题描述 OpenGL无法解析的外部符号 __iob,该符号在函数 _fgError 中被引用 正在学习OpenGL,之前将glut.h等都已经放到正确的位置了,现在用到一个新的库包含gltools.h,将相关库文件放到include文件目录下,编写了一个小程序测试一下,发现出现错误了,代码以及出错代码如下: #include "shared/gltools.h" //#include "glut.h" void RenderScene(void) { //用当前清

c++-C++函数模板中使用输出流出现 operator<< 不明确错误

问题描述 C++函数模板中使用输出流出现 operator<< 不明确错误 #include<iostream> #include<set> #include<string> using namespace std; template<class T> void print(T first, T last) { for (; first != last; ++first) { cout<<*first<<" &q

c++-关于链表在函数对象中节点的存储问题

问题描述 关于链表在函数对象中节点的存储问题 代码如下,写的是职工信息管理系统的前部分代码,通过类的对象p把数据保存在了结点中,但是只是对象,无法永久保存在链表里面,翻了很多书,代码,实在想不通,有人说用指针的引用List*&p来解决,但是我还是不懂,求大神帮帮忙吧,我一个人实在解决不了了,跪求大神啊,,,,,,#include#include#includeusing namespace std;class Stuff{public:char* Name;int medium;char* pN

入门篇:函数计算中角色和访问策略的讲解

阿里云函数计算是近期推出的一个无服务器的全托管的产品,使用者只需编写核心代码并设置运行的条件,即可在函数计算以弹性.安全地运行.函数计算能自行维护服务器资源,网络资源,以及消息分发和负载均衡等功能. 因为使用者需要把代码部署在函数计算上运行,能调用函数的方式有很多,可以通过APIGateway.Fcli.控制台以及OSS等各种事件源来触发函数执行,与此同时,函数计算作为执行单元需要授权交叉访问其他产品,众多的调用和模糊的安全界定,让大家在使用函数计算对角色的授权会感到困惑,其实简单来说,就是函数

JavaScript高级程序设计(第3版)学习笔记8 js函数(中)_基础知识

6.执行环境和作用域 (1)执行环境(execution context):所有的JavaScript代码都运行在一个执行环境中,当控制权转移至JavaScript的可执行代码时,就进入了一个执行环境.活动的执行环境从逻辑上形成了一个栈,全局执行环境永远是这个栈的栈底元素,栈顶元素就是当前正在运行的执行环境.每一个函数都有自己的执行环境,当执行流进入一个函数时,会将这个函数的执行环境压入栈顶,函数执行完之后再将这个执行环境弹出,控制权返回给之前的执行环境. (2)变量对象(variable ob

c cpp-error LNK2019: 无法解析的外部符号 _add,该符号在函数 _main 中被引用

问题描述 error LNK2019: 无法解析的外部符号 _add,该符号在函数 _main 中被引用 如果把所有的.cpp文件改成.c,程序正常运行.我认为加上extern "C"应该可以正常运行了,但是不行,求解 原理. student.h struct Student { char name[30]; int score; struct Student *next; }; typedef struct Student Stu; typedef struct Student *

无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 解决办法

一,问题描述 MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用 Debug\jk.exe : fatal error LNK1120: 1 个无法解析的外部命令 error LNK2001: unresolved external symbol _WinMain@16debug/main.exe:fatal error LNK 1120:1 unresolv