永发信息网

C++.Net中的一些疑惑

答案:3  悬赏:70  手机版
解决时间 2021-01-29 08:39
在.Net Framework 2.0的Managed C++中,有许多与标准C++不一样的地方.
例如定义一个类经常是
public ref class MyClass
{
//members
};
请问
1.第一个单词public表示的是什么?如果选private会怎样?
2.第二个单词ref表示什么?换成value的话有什么不同?
3.#pragma once这个指令是做什么用的?
4.有一个符号^,经常出现在一个类名字后面,比如String^ str;这个符号的用途跟指针有什么不同?

还望高手出来解答,多谢了!~~请尽量答详细一些
最佳答案
先回答第三个问题:

包含pragma once语句的文件只会被编译一次。

其他问题的答案下面都有:

我们来看看C++/CLI中是怎样来定义托管类型的:

如果要创建一个对于在托管堆中对象的应用(reference class),我们可以使用下面的两个关键词:

ref class

ref struct

其中,struct意味着默认情况下它的成员的访问级别为public,而class意味着默认情况下它的成员的访问级别为private。

如果要创建值类型(value class),那么可以使用下面的关键词:

value class

value struct

同样,对于接口,关键词为interface class。

所以,我们就可以看到这样的定义:

public ref class Block { ... };

public value class Vector { ... };

public interface class IMyFile { ... };

如果我们需要指定一个抽象(Abstract)的类,那么语法为:

public ref class Shape abstract {};

public ref class Shape2D abstract : public Shape{};

也可以指定为Sealed类型,以及Sealed和Abstract共用:

public ref class String sealed {};

public ref class State abstract sealed{};

创建了托管类型的对象,就要有指向他们的指针。这里是刚开始学习C++/CLI的时候,让人有些不习惯的地方,因为定义了一个全新的操作符^。

我们可以先来看看原来的_gc *和新的^的一些具体例子,然后再来感觉那个更好一些:

public __gc class Form1 : public System::Windows::Forms::Form {

private:

System::ComponentModel::Container __gc *components;

Button __gc *button1;

DataGrid __gc *myDataGrid;

DataSet __gc *myDataSet;

void PrintValues( Array* myArr )

{

System::Collections::IEnumerator* myEnumerator =

myArr->GetEnumerator();

Array *localArray = myArr->Copy();

// ...

}

};

public ref class Form1: public System::Windows::Forms::Form{

private:

System::ComponentModel::Container^ components;

Button^ button1;

DataGrid^ myDataGrid;

DataSet^ myDataSet;

void PrintValues( Array^ myArr )

{

System::Collections::IEnumerator^ myEnumerator =

myArr->GetEnumerator();

Array ^localArray = myArr->Copy();

// ...

}

};

是不是^更加自然呢?

可能会有人问:为什么不使用C++中原来的指针符号*呢?呵呵,因为这是托管代码啊!如果对象定义在非托管堆上,当然使用*了,但如果定义在托管堆上,就不能再简单地使用*了。我们可以看看下面的例子:

Button^ button1 = gcnew Button; // OK: managed heap

int * pi1 = new int; // OK: native heap

interior_ptr<Int32> pi2 = gcnew Int32; // OK: managed heap

这里说明两点:

1. 在C++/CLI中,同时使用gcnew,来说明对象是创建在托管堆上的。

2. 关于interior_ptr,留待后面解释。

同时,在C++/CLI中,数字0不再代表空地址,而仅仅代表数字0。空地址有一个关键字:nullptr。所以,下面的代码就是把0给boxing了,再传给指针obj:

Object^ obj=0;

而只有下面的语句,才真正把一个空指针给指针obj:

Object^ obj=nullptr;

顺便,谈谈boxing。boxing就是说,当你想把一个值(value)当作一个对象(object)的时候,发生的事情。例如上面的语句中,就是把一个值0变成了一个object对象。具体在后台发生的事情为:

1. 首先,这个值会被压入堆栈。

2. CLR接着会把这个值弹出堆栈,然后分配一块空间,来存储这个值以及对象头信息。

3. 接着,一个新创建的对象的引用,会被压入堆栈中。

4. 最后,把这个引用对象弹出堆栈,存储在本地变量中。

可见,代价非常大。所以,一般情况下,不要随便使用boxing(当然还有unboxing),因为对性能影响太大。

CLI数组的定义

C++/CLI中,数组定于为:

void PrintValues( array<Object^>^ myArr );

void PrintValues( array<int,3>^ myArr );

同时,还可以使用gcnew定义的时候,直接赋值:

array<Object^>^ myArray =

gcnew array<Object^>(4){ 1, 1, 2, 3 }

而且,还可以定义返回类型为CLI数组的函数:

array<Int32>^ f();

array<int>^ GetArray();
全部回答
public KK: [] DJ: [] a. 1. 公众的[Z][B] 2. 公共的,公用的[Z] You mustn't do that in a public place. 你不可在公共场所做那事。 3. 政府的,公务的[Z] 4. 公然的;众所周知的 They made the secret public. 他们公开了这个秘密。 n. 1. 公众,民众[the S][G] The public was provoked to anger. 公众被激怒了。 The museum is open to the public. 这个博物馆对大众开放。 2. (某方面的)大众,群众;...界[S][G]
上面的都回答的是什么啊 1.c++是一个语言,.net是一个平台,他们两个关系不是很大,唯一一点是.net有一种托管c++语言叫cli/c++ 2.c#是微软针对.net而专门推出的一种编程语言 3.一般都使用visual studio,其他的也有sharpdevelop也可以 4.c++有很多种,所以编辑它也有很多可以选择,如果是windows平台下,你可以选择visual c++6.0,如果是托管c++可以使用visual studio2003 以上的,其他的诸如c++builder,eclipse for c++都可以 5..net是一个大平台,包含了可以说所有windows下开发所需要的东西,类库啊,工具啊等等,五花八门的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
衣库男人的衣柜怎么去啊,我要去那办事
粱达运输地址有知道的么?有点事想过去
善困的意思是什么啊?知道的请说下!
用皮肤药过敏了怎么办
玩美女店地址在哪,我要去那里办事
有一首歌很愉快,然后开头有beautiful
联想电脑上的鼠标箭头不见了,怎么弄呀
穴中人为什么要杨氏入穴“勿携金珠锦绣珍异等
南充在那儿办货运资格证
圆通速递(英额门代收点)地址在哪,我要去那里
天竺外贸地址在哪,我要去那里办事
读我国沙漠化土地成因构成示意图,回答下列各
极笑的意思是什么啊?知道的请说下!
长吉理货服务处(河堤路二店)地址有知道的么?
solidworks2012打不开
推荐资讯
真搞不懂!!!为什么非洲人那么喜欢生孩子!
网线没有拔出路由器按一键还原对电脑有影响吗
眴瞀的意思是什么啊?知道的请说下!
农村有俩座房屋能办理房产证吗
关于联合体投标的说法,正确的有()。A.多个
火 土 风 水 经过怎么样的变换会衍生出雷
全文的意思是什么啊?知道的请说下!
从山东泰安到海南三亚需要路费多少
元咀村地址在什么地方,我要处理点事
ADOQuery1.SQL.Add('update...... ?
按国家规定,甲方承担为乙方担保贷款的风险,视
原厂车载导航真的不好用吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?