同一个类的两个不同对象可以访问对方的private成员吗?

softworm 2003-08-25 03:33:35
请大家看看下面这段程序,它是能够正常编译连接运行的。但是为什么
assign成员函数没有错呢?谁能告诉我c++中关于这种情况的内幕?谢谢!

#include <stdio.h>

class Test {
private:
int a;
int b;
public:
Test(int a_v, int b_v);
void assign(Test *source);
void print(void);
};

Test::Test(int a_v, int b_v)
{
a = a_v;
b = b_v;
}

void Test::assign(Test *source)
{
a = source->a;
b = source->b;
}

void Test::print()
{
printf("a = %d, b = %d\n", a, b);
}

int main()
{
Test t1(1, 2), t2(3, 4);

t2.assign(&t1);

t2.print();

return 0;
}
...全文
513 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
softworm 2003-09-20
  • 打赏
  • 举报
回复
谢谢各位的热心发言。在此我准备结贴了。
TianGuangZao 2003-09-12
  • 打赏
  • 举报
回复
对楼主的疑问简单回答。
在定义一个类时,你可以把其它类对象作为该类的数据成员,也可以让该类的成员函数接受其它类对象,这里的其它类包括自己。
hfhappyfish 2003-09-12
  • 打赏
  • 举报
回复
C++正是通过访问控制来实现封装和数据的隐藏
它通过关键字private,public,等关键字和类的定义来达到访问控制的的目的。
但这不是唯一目的
hfhappyfish 2003-09-12
  • 打赏
  • 举报
回复
把C++看作更好的C
也可以这样理解
struct Test{
int a;
int b;
};
void Test::assign(Test *this,Test *source)
{
this->a = source->a;
this->b = source->b;
}
而C++在此基础上使用了
private关键字和使assign出现在类的成员中
---------------------------------------------------------------------
private关键字告诉编译器结构a,b只能被类的成员函数(或者友元)访问;
assign出现在类成员中告诉编译器它是类Test的成员,有权限访问任何一个实例化结构的a与b。
所以编译器不认为有错。
这体现了C++的缺陷?
hfhappyfish 2003-09-12
  • 打赏
  • 举报
回复
因为t2.assign(&t2);是正确的
t2.assign(&t1);与上面没有本质区别
step_by_step 2003-09-11
  • 打赏
  • 举报
回复
因为c++的封装性只到类这一层,不到对象这一层,所以那个assign函数没有什么好奇怪的
鄢老 2003-09-11
  • 打赏
  • 举报
回复
我运行了一下,结果是a=1,b=2.后来想了想,觉得是很正常的。因为t1和t2是在同一个类成员函数中定义,之后又在同一个类成员函数中运算的,所以说t1的私有成员可以当成参数传给t2的私有成员的。
l1ul1u 2003-09-09
  • 打赏
  • 举报
回复
c++是可以这样访问的
xueweizhong 2003-09-08
  • 打赏
  • 举报
回复
贴上去就格式乱了,再贴一下:

再论ACCESS-CONTROL:
(我把搂主的代码简化了一下下)

/**
* 请大家看看下面这段程序,它是能够正常编译连接运行的。但是为什么
* assign成员函数没有错呢?谁能告诉我c++中关于这种情况的内幕?谢谢!
*/

#include <stdio.h>

class Test
{
private:
int a;
public:
Test(int);
void assign(Test const* source);
};

void Test::assign(Test *source)
{
a = source->a;
}

int main()
{
Test t1(1), t2(2);
t2.assign(&t1);
}

1: 关于ACCESS-CONTROL的定义

<<C++98 std/chapter 11>>:
1 A member of a class can be

--private; that is, its name can be used only by
member functions, static data members, and
friends of the class in which it is declared.

--protected; that is, its name can be used only by
member functions, static data members, and
friends of the class in which it is declared
and by member functions, static data members,
and friends of classes derived from this class.

--public; that is, its name can be used
anywhere without access restriction.

2: 一些相关的note:
1) name
ACCESS-CONTROL 只应用到name(simple identifier).
按照上面的定义,ACCESS-CONTROL针对且只针对
member of class.
即使是涉及到模板,也只是关心name,
而不关心template-argument

2) unnamed object
无名对象不考虑access-control:
如下:
struct A
{
private:
struct B
{
int i;
};
B m_b;
public:
B& f() { return m_b; }
};
int main()
{
A a;
f()->i; // only names are f, i,
// f and i is public,
// so it's legal even
// if B in private A member
}
3) 关于protected member name有一个例外情况,
参见(4:)中例子的new note

3: 让人迷惑的代码段的注记

void Test::assign(Test *source)
{
a = source->a;
/**
1) 这里出现的name是
void, Test, assign, source, a
2) void, Test, source,
不是class member,
不做access-control考虑
3) assign是成员函数名,
但我们只是定义它,
不在这里使用,
也不做access-control考虑

4)a是private Test member,
可以在A的成员函数中使用,
现在刚好是在Test的
assign成员函数体内。

5) but what about "source->a":
OK, a in "source->a" means
a is a member name of source's class Test
and used in Test member function,
everything is fine!!!
(still confusing, see following example ...)
*/
}

4: 更加清楚的例子(我的)注记

struct Base
{
protected:
int m_protected;
};

struct Son2 : Base {};

struct Son1 : Base
{

void foo(Son1& s)
{
s.m_protected; // legal, Son1可以
// 看到所有自己子类的秘密。
/**
new note:
same as 3/5)
*/
}

void foo(Base& b)
{
b.m_protected; // illegal <--
// 比如Son1不能看到Son2的东西
//(b may be a Son2)
// Son1不能看到兄弟Son2的秘密。
/**
new note:
m_protected in "b.m_protected" means:
m_protected is Base(b's type) class
member, not Son1 class member
which means:
Base's protected member is used
in Son1's member function
By definition, it's legal, but
因为C++标准规定一个关于
proected member的例外情况,
When a member function of a
derived class references
a protected nonstatic member
of a base class, an access check
applies in addition to those
described earlier in this clause:
Except when forming a pointer to
member,the access must be through
a pointer to,
reference to,
<---我们的情况
or object
<---下一个成员函数的情况
of the derived class itself
(or any class derived from that class).
因为儿子不能管老子,所以结论是
illegal
*/

}
void foo(Base b)
{
b.m_protected; // seems legal. why??
/**
new note:
illegal : 儿子不能管老子
原因同 void foo(Base& c)的分析。
*/
}
};
supwjhuLoveCjj 2003-09-08
  • 打赏
  • 举报
回复
C++的封装是针对类的,而不是针对对象的
已经足够说明问题了
xueweizhong 2003-09-08
  • 打赏
  • 举报
回复
再论ACCESS-CONTROL:
(我把搂主的代码简化了一下下)

/**
* 请大家看看下面这段程序,它是能够正常编译连接运行的。但是为什么
* assign成员函数没有错呢?谁能告诉我c++中关于这种情况的内幕?谢谢!
*/

#include <stdio.h>

class Test
{
private:
int a;
public:
Test(int);
void assign(Test const* source);
};

void Test::assign(Test *source)
{
a = source->a;
}

int main()
{
Test t1(1), t2(2);
t2.assign(&t1);
}

1: 关于ACCESS-CONTROL的定义

<<C++98 std/chapter 11>>:
1 A member of a class can be

--private; that is, its name can be used only by member functions,
static data members, and friends of the class in which it is
declared.

--protected; that is, its name can be used only by member functions,
static data members, and friends of the class in which it is
declared and by member functions, static data members, and friends
of classes derived from this class (see _class.protected_).

--public; that is, its name can be used anywhere without access
restriction.

2: 一些相关的note:
1) name
ACCESS-CONTROL 只应用到name(simple identifier).
按照上面的定义,ACCESS-CONTROL针对且只针对 member of class.
即使是涉及到模板,也只是关心name, 而不关心template-argument
2) unnamed object
无名对象不考虑access-control:
如下:
struct A
{
private:
struct B
{
int i;
};
B m_b;
public:
B& f() { return m_b; }
};
int main()
{
A a;
f()->i; // only names are f, i, f and i is public, so it's legal even if B in private A member
}
3) 关于protected member name有一个例外情况,参见(4:)中例子的new note

3: 让人迷惑的代码段的注记

void Test::assign(Test *source)
{
a = source->a;
/**
1) 这里出现的name是void, Test, assign, source, a
2) void, Test, source, 不是class member, 不做access-control考虑
3) assign是成员函数名, 但我们只是定义它,不在这里使用,也不做access-control考虑

4)a是private Test member, 可以在A的成员函数中使用,现在刚好是在Test的assign成员函数体内。

5) but what about "source->a":
OK, a in "source->a" means a is a member name of source's class Test
and used in Test member function,
everything is fine!!!
(still confusing, see following example ...)
*/
}

4: 更加清楚的例子(我的)注记

struct Base
{
protected:
int m_protected;
};

struct Son2 : Base {};

struct Son1 : Base
{

void foo(Son1& s)
{
s.m_protected; // legal, Son1可以看到所有自己子类的秘密。
/**
new note:
same as 3/5)
*/
}

void foo(Base& b)
{
b.m_protected; // illegal <--比如Son1不能看到Son2的东西(b may be a Son2)
// Son1不能看到兄弟Son2的秘密。
/**
new note:
m_protected in "b.m_protected" means:
m_protected is Base(b's type) class member, not Son1 class member
which means:
Base's protected member is used in Son1's member function
By definition, it's legal, but
因为C++标准规定一个关于proected member的例外情况,
When a member function of a derived class
references a protected nonstatic member of a base class,
an access check applies in addition to those described
earlier in this clause:
Except when forming a pointer to member,the access must be through
a pointer to,
reference to, <---我们的情况
or object <---下一个成员函数的情况
of the derived class itself (or any class derived from that class).
因为儿子不能管老子,所以结论是
illegal
*/

}
void foo(Base b)
{
b.m_protected; // seems legal. why??
/**
new note:
illegal : 儿子不能管老子
原因同 void foo(Base& c)的分析。
*/
}
};






limd 2003-09-08
  • 打赏
  • 举报
回复
以前我看了也很迷惑的,到现在有点感悟了。
robertnet 2003-09-08
  • 打赏
  • 举报
回复
问:C++编译器为我们做了什么?
答:在类的实现过程中添加了this指针。
Test::Test()
{
a = 10;
}为例。
楼主请看,实际C++编译器为我们添油加醋之后的实际运行代码:
Test::Test(Test* this)
{
this->a = 10;
}
其他类似。
cernet 2003-09-08
  • 打赏
  • 举报
回复
请大家看看下面这段程序,它是能够正常编译连接运行的。但是为什么
assign成员函数没有错呢?谁能告诉我c++中关于这种情况的内幕?谢谢!

#include <stdio.h>

class Test {
private:
int a;
int b;
public:
Test(int a_v, int b_v);
void assign(Test *source);//assign成员函数的参数是一个Test类型指针
void print(void);
};

Test::Test(int a_v, int b_v)
{
a = a_v;
b = b_v;
}

void Test::assign(Test *source)
{
a = source->a;
b = source->b;
}

void Test::print()
{
printf("a = %d, b = %d\n", a, b);
}

int main()
{
Test t1(1, 2), t2(3, 4);

t2.assign(&t1);//t1是Test类型对象,用&取得t1的地址就得到一个Test类型的指针

t2.print();

return 0;
}
assign成员函数的参数是一个Test类型指针
t1是Test类型对象,用&取得t1的地址就得到一个Test类型的指针
这当然没有挑剔的,当然编译通过了
zss6587 2003-09-08
  • 打赏
  • 举报
回复
"cchm(using namespace std)
c++里,类的访问权限是class level,不是object level的。
访问权限只在编译时对编译器有效,在运行时,不存在访问权限这道栅栏。"

言简意赅!!!
alan118 2003-09-07
  • 打赏
  • 举报
回复
C++的封装是针对类的,而不是针对对象的
manchesterunite 2003-09-07
  • 打赏
  • 举报
回复
显然是可以的,这个也是我刚刚看c++书的时候最疑惑的。
比如这样的代码:
#include <iostream>
using namespace std;

class Test{
public:
Test();
Test( const Test & );
void print() const;
private:
int a;
};

Test::Test()
{
a = 10;
}

Test::Test( const Test &oT )
{
a = oT.a;
}

void Test::print() const
{
cout << a ;
}

int main(){
class Test t1,t2(t1);
t2.print();
return 0;
}

就完全可以编译通过,在里面构造函数的重载中,同一个类的对象之间的“毫无隐私”起到了十分重要的作用。
个人决的这和对象的封装有矛盾之处,他的确只对类进行了封装,而对象之间(同类对象)却是“坦诚相见”的。
SingleEyelid 2003-09-07
  • 打赏
  • 举报
回复
我觉的你在问这个问题之前可以自己先测试一下,这样你就知道该不该问这个问题啦.
williamVII 2003-09-07
  • 打赏
  • 举报
回复
quote: wbh0360(剑仙): C++的封装是针对类的,而不是针对对象.

That is the answer.
A simple truth in C++.
A design desision.
If otherwise,the usage of member funtion would be too limited.
Of course,you can write some special member funtion which
provide you the access to private members.
However,add such funtions to your class is obviously an overhaed
which goes against the objective of C++.


Oversense 2003-09-07
  • 打赏
  • 举报
回复
当然可以了
java也可以,理由就是 封装的层次在类上,而不是对象
还有,如果你写编译器,也希望这么写啊
加载更多回复(21)
     区块链起源于比特币,2008年11月1日,一位自称中本聪(Satoshi Nakamoto)的人发表了《比特币:一种点对点的电子现金系统》一文 [4]  ,阐述了基于P2P网络技术、加密技术、时间戳技术、区块链技术等的电子现金系统的构架理念,这标志着比特币的诞生。两个月后理论步入实践,2009年1月3日第一个序号为0的创世区块诞生。几天后2009年1月9日出现序号为1的区块,并与序号为0的创世区块相连接形成了链,标志着区块链的诞生 [5]  。 近年来,世界对比特币的态度起起落落,但作为比特币底层技术之一的区块链技术日益受到重视。在比特币形成过程中,区块是一个一个的存储单元,记录了一定时间内各个区块节点全部的交流信息。各个区块之间通过随机散列(也称哈希算法)实现链接,后一个区块包含前一个区块的哈希值,随着信息交流的扩大,一个区块与一个区块相继接续,形成的结果就叫区块链。 什么是区块链?从科技层面来看,区块链涉及数学、密码学、互联网和计算机编程等很多科学技术问题。从应用视角来看,简单来说,区块链是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。这些特点保证了区块链的“诚实”与“透明”,为区块链创造信任奠定基础。而区块链丰富的应用场景,基本上都基于区块链能够解决信息不对称问题,实现多个主体之间的协作信任与一致行动 [7]  。 区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),是比特币的一个重要概念,它本质上是一个去中心化的数据库,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块 [8]  。 比特币白皮书英文原版 [4]  其实并未出现 blockchain 一词,而是使用的 chain of blocks。most早的比特币白皮书中文翻译版 [9]  中,将 chain of blocks 翻译成了区块链。这是“区块链”这一中文词most早的出现时间。 国家互联网信息办公室2019年1月10日发布《区块链信息服务管理规定》,自2019年2月15日起施行 [1]  。 作为核心技术自主创新的重要突破口,区块链的安全风险问题被视为当前制约行业健康发展的一大短板,频频发生的安全事件为业界敲响警钟。拥抱区块链,需要加快探索建立适应区块链技术机制的安全保障体系。 2008年由中本聪第一次提出了区块链的概念 [4]  ,在随后的几年中,区块链成为了电子货币比特币的核心组成部分:作为所有交易的公共账簿。通过利用点对点网络和分布式时间戳服务器,区块链数据库能够进行自主管理。为比特币而发明的区块链使它成为第一个解决重复消费问题的数字货币。比特币的设计已经成为其他应用程序的灵感来源。 2014年,区块链2.0”成为一个关于去中心化区块链数据库的术语。对这个第二代可编程区块链,经济学家们认为它是一种编程语言,可以允许用户写出更精密和智能的协议 [11]  。因此,当利润达到一定程度的时候,就能够从完成的货运订单或者共享证书的分红中获得收益。区块链2.0技术跳过了交易和“价值交换中担任金钱和信息仲裁的中介机构”。它们被用来使人们远离全球化经济,使隐私得到保护,使人们“将掌握的信息兑换成货币”,并且有能力保证知识产权的所有者得到收益。第二代区块链技术使存储个人的“永久数字ID和形象”成为可能,并且对“潜在的社会财富分配”不平等提供解决方案 [12]  。 2016年1月20日,中国人民银行数字货币研讨会宣布对数字货币研究取得阶段性成果。会议肯定了数字货币在降低传统货币发行等方面的价值,并表示央行在探索发行数字货币。中国人民银行数字货币研讨会的表达大大增强了数字货币行业信心。这是继2013年12月5日央行五部委发布关于防范比特币风险的通知之后,第一次对数字货币表示明确的态度。 [13]  2016年12月20日,数字货币联盟——中国FinTech数字货币联盟及FinTech研究院正式筹建 [14]  。 如今,比特币仍是数字货币的绝对主流,数字货币呈现了百花齐放的状态,常见的有bitcoin、litecoin、dogecoin、dashcoin,除了货币的应用之外,还有各种衍生应用,如以太坊Ethereum、Asch等底层应用开发平台以及NXT,SIA,比特股,MaidSafe,Ripple等行业应用。 公有区块链 公有区块链(Public Block Chains)是指:世界上任何个体或者团体都可以发送交易,且交易能够获得该区块链的有效确认,任何人都可以参与其共识过程。公有区块链是most早的区块链,也是应用most广泛的区块链,各大bitcoins系列的虚拟数字货币均基于公有区块链,世界上有且仅有一条该币种对应的区块链 [16]  。 联合(行业)区块链 行业区块链(Consortium Block Chains):由某个群体内部指定多个预选的节点为记账人,每个块的生成由所有的预选节点共同决定(预选节点参与共识过程),其他接入节点可以参与交易,但不过问记账过程(本质上还是托管记账,只是变成分布式记账,预选节点的多少,如何决定每个块的记账者成为该区块链的主要风险点),其他任何人可以通过该区块链开放的API进行限定查询 [16]  。 私有区块链 私有区块链(Private Block Chains):仅仅使用区块链的总账技术进行记账,可以是一个公司,也可以是个人,独享该区块链的写入权限,本链与其他的分布式存储方案没有太大区别。传统金融都是想实验尝试私有区块链,而公链的应用例如bitcoin已经工业化,私链的应用产品还在摸索当中 [16]  。 去中心化。区块链技术不依赖额外的第三方管理机构或硬件设施,没有中心管制,除了自成一体的区块链本身,通过分布式核算和存储,各个节点实现了信息自我验证、传递和管理。去中心化是区块链most突出most本质的特征 [17]  。 开放性。区块链技术基础是开源的,除了交易各方的私有信息被加密外,区块链的数据对所有人开放,任何人都可以通过公开的接口查询区块链数据和开发相关应用,因此整个系统信息高度透明 [17]  。 独立性。基于协商一致的规范和协议(似比特币采用的哈希算法等各种数学算法),整个区块链系统不依赖其他第三方,所有节点能够在系统内自动安全地验证、交换数据,不需要任何人为的干预 [17]  。 安全性。只要不能掌控全部数据节点的51%,就无法肆意操控修改网络数据,这使区块链本身变得相对安全,避免了主观人为的数据变更 [17]  。 匿名性。除非有法律规范要求,单从技术上来讲,各区块节点的身份信息不需要公开或验证,信息传递可以匿名进行 架构模型 区块链基础架构模型 一般说来,区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成 [15]  。 其中,数据层封装了底层数据区块以及相关的数据加密和时间戳等基础数据和基本算法;网络层则包括分布式组网机制、数据传播机制和数据验证机制等;共识层主要封装网络节点的各共识算法;激励层将经济因素集成到区块链技术体系中来,主要包括经济激励的发行机制和分配机制等;合约层主要封装各脚本、算法和智能合约,是区块链可编程特性的基础;应用层则封装了区块链的各种应用场景和案例。该模型中,基于时间戳的链式区块结构、分布式节点的共识机制、基于共识算力的经济激励和灵活可编程的智能合约是区块链技术most具代表性的创新点 [18]  。 核心技术 分布式账本 分布式账本指的是交易记账由分布在不同地方的多个节点共同完成,而且每一个节点记录的是完整的账目,因此它们都可以参与监督交易合法性,同时也可以共同为其作证 [19]  。 跟传统的分布式存储有所不同,区块链的分布式存储的独特性主要体现在两个方面:一是区块链每个节点都按照块链式结构存储完整的数据,传统分布式存储一般是将数据按照一定的规则分成多份进行存储。二是区块链每个节点存储都是独立的、地位等同的,依靠共识机制保证存储的一致性,而传统分布式存储一般是通过中心节点往其他备份节点同步数据。没有任何一个节点可以单独记录账本数据,从而避免了单一记账人被控制或者被贿赂而记假账的可能性。也由记账节点足够多,理论上讲除非所有的节点被破坏,否则账目就不会丢失,从而保证了账目数据的安全性 [19]  。 非对称加密 存储在区块链上的交易信息是公开的,但是账户身份信息是高度加密的,只有在数据拥有者授权的情况下才能访问到,从而保证了数据的安全和个人的隐私 [20]  。 共识机制 共识机制就是所有记账节点之间怎么达成共识,去认定一个记录的有效性,这既是认定的手段,也是防止篡改的手段。区块链提出了四种不同的共识机制,适用于不同的应用场景,在效率和安全性之间取得平衡 [20]  。 区块链的共识机制具备“少数服从多数”以及“人人平等”的特点,其中“少数服从多数”并不完全指节点个数,也可以是计算能力、股权数或者其他的计算机可以比较的特征量。“人人平等”是当节点满足条件时,所有节点都有权优先提出共识结果、直接被其他节点认同后并most后有可能成为most终共识结果。以比特币为例,采用的是工作量证明,只有在控制了全网超过51%的记账节点的情况下,才有可能伪造出一条不存在的记录。当加入区块链的节点足够多的时候,这基本上不可能,从而杜绝了造假的可能 [20]  。 智能合约 智能合约是基于这些可信的不可篡改的数据,可以自动化的执行一些预先定义好的规则和条款。以保险为例,如果说每个人的信息(包括医疗信息和风险发生的信息)都是真实可信的,那就很容易的在一些标准化的保险产品中,去进行自动化的理赔。在保险公司的日常业务中,虽然交易不像银行和证券行业那样频繁,但是对可信数据的依赖是有增无减。因此,笔者认为利用区块链技术,从数据管理的角度切入,能够有效地帮助保险公司提高风险管理能力。具体来讲主要分投保人风险管理和保险公司的风险监督 [20]  。 应用 金融领域 区块链在国际汇兑、信用证、股权登记和证券交易所等金融领域有着潜在的巨大应用价值。将区块链技术应用在金融行业中,能够省去第三方中介环节,实现点对点的直接对接,从而在大大降低成本的同时,快速完成交易支付 [21]  。 比如Visa推出基于区块链技术的 Visa B2B Connect,它能为机构提供一种费用更低、更快速和安全的跨境支付方式来处理全球范围的企业对企业的交易。要知道传统的跨境支付需要等3-5天,并为此支付1-3%的交易费用。Visa 还联合 Coinbase 推出了首张比特币借记卡,花旗银行则在区块链上测试运行加密货币“花旗币” [21]  。 物联网和物流领域 区块链在物联网和物流领域也可以天然结合。通过区块链可以降低物流成本,追溯物品的生产和运送过程,并且提高供应链管理的效率。该领域被认为是区块链一个很有前景的应用方向 [22]  。 区块链通过结点连接的散状网络分层结构,能够在整个网络中实现信息的全面传递,并能够检验信息的准确程度。这种特性一 定程度上提高了物联网交易的便利性和智能化。区块链+大数据的解决方案就利用了大数据的自动筛选过滤模式,在区块链中建立信用资源,可双重提高交易的安全性,并提高物联网交易便利程度。为智能物流模式应用节约时间成本。区块链结点具有十分自由的进出能力,可独立的参与或离开区块链体系,不对整个区块链体系有任何干扰。区块链 +大数据解决方案就利用了大数据的整合能力,促使物联网基础用户拓展更具有方向性,便于在智能物流的分散用户之间实现用户拓展 [22]  。 公共服务领域 区块链在公共管理、能源、交通等领域都与民众的生产生活息息相关,但是这些领域的中心化特质也带来了一些问题,可以用区块链来改造。区块链提供的去中心化的完全分布式DNS服务通过网络中各个节点之间的点对点数据传输服务就能实现域名的查询和解析,可用于确保某个重要的基础设施的操作系统和固件没有被篡改,可以监控软件的状态和完整性,发现不良的篡改,并确保使用了物联网技术的系统所传输的数据没用经过篡改 [23]  。 数字版权领域 通过区块链技术,可以对作品进行鉴权,证明文字、视频、音频等作品的存在,保证权属的真实、唯一性。作品在区块链上被确权后,后续交易都会进行实时记录,实现数字版权全生命周期管理,也可作为司法取证中的技术性保障。例如,美国纽约一家创业公司Mine Labs开发了一个基于区块链的元数据协议,这个名为Mediachain的系统利用IPFS文件系统,实现数字作品版权保护,主要是面向数字图片的版权保护应用 [24]  。 保险领域 在保险理赔方面,保险机构负责资金归集、投资、理赔,往往管理和运营成本较高。通过智能合约的应用,既无需投保人申请,也无需保险公司批准,只要触发理赔条件,实现保单自动理赔。一个典型的应用案例就是LenderBot, 是 2016 年由区块链企业 Stratumn、德勤与支付服务商 Lemonway 合作推出,它允许人们通过 Facebook Messenger 的聊天功能,注册定制化的微保险产品, 为个人之间交换的高价值物品进行投保,而区块链在贷款合同中代替了第三方角色 [25]  。 公益领域 区块链上存储的数据,高可靠且不可篡改,天然适合用在社会公益场景。公益流程中的相关信息,如捐赠项目、募集明细、资金流向、受助人反馈等,均可以存放于区块链上,并且有条件地进行透明公开公示,方便社会监督 [26]  。 面临的挑战 从实践进展来看,区块链技术在商业银行的应用大部分仍在构想和测试之中,距离在生活、生产中的运用还有很长的路,而要获得监管部门和市场的认可也面临不少困难,主要有: (一)受到现行观念、制度、法律制约。区块链去中心化、自我管理、集体维护的特性颠覆了人们生产生活方式,淡化了国家、监管概念,冲击了现行法律安排。对于这些,整个世界完全缺少理论准备和制度探讨。即使是区块链应用most成熟的比特币,不同国家持有态度也不相同,不可避免阻碍了区块链技术的应用与发展。解决这问题,显然还有很长的路要走 [27]  。 (二)在技术层面,区块链尚需突破性进展。区块链应用尚在实验室初创开发阶段,没有直观可用的成熟产品。比之于互联网技术,人们可以用浏览器、APP等具体应用程序,实现信息的浏览、传递、交换和应用,但区块链明显缺乏这突破性的应用程序,面临高技术门槛障碍。再比如,区块容量问题,由于区块链需要承载复制之前产生的全部信息,下一个区块信息量要大于之前区块信息量,这样传递下去,区块写入信息会无线增大,带来的信息存储、验证、容量问题有待解决 [27]  。 (三)竞争性技术挑战。虽然有很多人看好区块链技术,但也要看到推动人发展的技术有很多种,哪种技术更方便更高效,人们就会应用该技术。比如,如果在通信领域应用区块链技术,通过发信息的方式是每次发给全网的所有人,但是只有那个有私钥的人才能解密打开信件,这样信息传递的安全性会大大增加。同样,量子技术也可以做到,量子通信——利用量子纠缠效应进行信息传递——同样具有高效安全的特点,近年来更是取得了不小的进展,这对于区块链技术来说,就具有很强的竞争优势。 

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧