我们知道如果不希望改变某个变量的值就用const修饰它,让它变为常量.基本类型和指针类型都能用const来修饰.数组也可以用const来修饰.
那你自然要问我们把class实例化成一个对象后,如果不希望修改对象中的成员变量,让对象变得像个常量一样该咋整呢?
你首先自然会想到把类中所有的成员变量都用const修饰不就得了.其实这确实是个办法拉,但是如果我们只是想某个类的一个实例对象弄得像常量啊.你这样用const整就真成了常量了,所有类的实例都只能当常量来处理了.这显然不行拉.
其实很简单,我们只要实例化类时加个const修饰下就OK,但是由于类不是个简单的类型.所以还涉及到一些特殊的操作.还是举个简单的例子看下.
class MyClass
{
public:
int age;
string name;
MyClass(int num,string str)
{
age = num;
name = str;
}
void Test() { Print(); }
void Print() const
{
std::cout<<name<<endl;
}
~MyClass(void);
};
const MyClass my(110,"arwen"); //实例化类时用const修饰.
my.age = 911; //这样会出错,既然用const修饰了肯定就变得像常量一样,不能改变成员变量的值了.
my.Print(); //正确执行
my.Test(); //出错了
为啥调用my.Test()时会出错呢? 这就是特殊的地方了.当用const修饰一个对象后,此对象就只能调用const修饰的函数了(const必须放到函数变后面).而一般的函数是不能被调用了.
为啥这样其实很简单,出于一致性考虑.既然不让直接修改成员变量了.那任何潜在的有可能修改成员变量的操作都就禁止.因为一般函数中有可能会修改了成员变量值.所以干脆禁止调用.
函数后面加个const是代表啥意思呢.它是代表在此函数中不能修改成员变量的值.例如
void Print() const { age = 456;} //这样会出错.当然你如果在函数中修改其他不是成员变量的值就没问题.
const修饰的函数中如果有调用到其他函数,那被调用的函数也只能是后面被const修饰的.当然一般函数调用const修饰的函数是没啥限制的.
所以通过当用const修饰对象后
1.不能像my.age = 911这样直修改成员变量
2.对象只能调用被const修饰的函数
3.被const修饰的函数中不能修改成员变量,且它也只能调用其他也被const修饰的函数.
通过这三点确保了成员函数在任何情况下都不会被修改.用构造函数赋值后就一直不变.
上面说到的用const修饰函数也可以单独用,不一定和const修饰对象配合用.单独用的话约定也是一样,函数中不能修改成员变量
上面说的是在C++中,那在C#中呢?
首先C#中一般把成员变量叫作字段.跟C++不同,C#中可以直接给字段赋值的.所以用const修饰类中的字段,然后赋值是没问题的.但显然我们很多时候是希望用构造函数来赋值的.那咋整呢?也像C++一样用个const修饰下就OK了吗.那不行.因为用const修饰引用类型时只能给赋值为null,那等于说那对象没任何用处了.当然C#自然有其他操作可以达到类似的效果.那就是通过属性加权限修饰符.
class MyClass
{
private int age;
private string name;
public int Age {
get{return age;}
}
public int Name {
get{return name;}
}
MyClass(int num,string str)
{
age = num;
name = str;
}
}
如果不希望用户修改字段.就把字段全部设为private的.然后用属性提供个接口.只有读的权限,不能修改.只有构造函数能赋值一次.那你可能会问其他成员函数会修改啊?
这就需要遵守一个约定了,就是类中其他函数别直接去用字段,也只是去用属性Age,Name.当然这只是推荐的作法,如果你实在想去直接用字段,去修改了.那就没办法了啊.
反正C#中使用了属性,推荐的作法就是在成员函数中直接用属性,别直接用字段了.
另外还有个办法就是用readonly修饰字段,这样就只能读不能修改了.
分享到:
相关推荐
C++与C#应用:C++调用C#DLL 示例源码 https://blog.csdn.net/DATA_3/article/details/125626342
便捷的C++转C#工具,用于将完整的C++项目转换成C#项目
本人慢慢在网上各地收集及自己验证后总结的C/C++和C#的数据类型对照.没有完全 验证..组织部 类型太多了..要怪就怪C/C++的type define这个该死的语法 吧...
C++与C#的一些比较,适合学习者。为您提供这两种语言的最重要差异。
C++ 与C#之间的指针参数传递,实现无限量数据的传递,轻松无压力,方便在C++里面获取或者从C#传递数据到C++的动态库调用内。
但是,我要用在C++项目中,怎么让C++调用C#的DLL呢。今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode ...
c++和C#数据类型对比
DLL生成与调用,c++与c#各自以及相互,包括: 1.c++创建和调用DLL(使用declspec方法) 2.c++创建和调用DLL(使用def方法) 3.c#创建和调用DLL 4.c++创建DLL和c#调用 5.c#创建DLL和c++调用
C++调用C#的DLL实例程序,压缩包中包含部分程序说明,很小的几行代码,但是C++调用C#的DLL目的已经达到。
C++程序员快速学习C# 随着.NET的深入人心,作为一个程序员,当然不能在新技术面前停而止步,面对着c++在.net中的失败,虽然有一丝遗憾,但是我们...废话不多说,现在就让我们用c++的基础来学习这个渐渐壮大的新语言-----C#
用C++调用C#实例代码,C#封装为DLL。
一个c#与c++互调的例子,c#调用c++的dll,c++调用c#的方法和事件
C#调用C++.C#调用C++.C#调用C++.C#调用C++.C#调用C++.C#调用C++.C#调用C++.C#调用C++.C#调用C++.C#调用C++.C#调用C++.
网文 C++和C#相互调用COM组件举例等。
c++转C#工具,c++转C#工具.c++转C#工具
实现了c++与c#之间的命名管道通信,其中c++作为服务器端,c#作为客户端
对于C#编程,遇到调用C++的dll,对于头文件中的格式转换确实很头疼,简单的格式还好,复杂一点,涉及指针,接口,回掉等高级格式,就不知道怎么转换了,附件的工具可以直接转换,下载打开exe即可,不知道如何使用...
C++ C#混合编程
c++调用C# COM 参数是结构体数组
C# 是纯面向对象语言,C++ 除了面向对象,也面向过程。C# 支持垃圾收集,C++ 不支持垃圾收集。C#需要虚拟机器,C++ 不需要虚拟机器。C# 的执行档是中间码,叫做 managed code,透过 NGWS Runtime 来执行。除了 C#,...