c类访问修饰符
1. c#中的类中的5种不同访问修饰符的含义
这个要看类的位置,
如果类,结构,代理,枚举是外置的,那修饰符只有:public 和 internal,默认是internal。
至于private和protected是用来修饰类的成员。
如果是内置的,就是作为另一个类型的成员,也称内部类型(inner type),这样的话,修饰符可以是全部可用修饰符,默认是private。
举例:
class a {} 类a是internal
c#中类的默认访问修饰符,默认是internal :C#用多种修饰符来表达类的不同性质。
根据其保护级 C#的类有五种不同的限制修饰符:public 可以被任意存取;
protected 只可以被本类和其继承子类存取;
internal只可以被本组合体(Assembly)内所有的类存取,组合体是C# 语言中类被组合后的逻辑单位和物理单位,其编译后的文件扩展名往往是“.DLL”或“.EXE”protected internal唯一的一种组合限制修饰符,它只可以被本组合体内所有的类和这些类的继承子类所存取。
private 只可以被本类所存取。如果不是嵌套的类,命名空间或编译单元内的类只有public和internal两种修饰。
new 修饰符只能用于嵌套的类,表示对继承父类同名类型的隐藏。
abstract 用来修饰抽象类,表示该类只能作为父类被用于继承,而不能进行对象实例化。
抽象类可以包含抽象的成员,但这并非必须。abstract 不能和new 同时用
2. c# 访问修饰符 internal 和protected internal的区别
protected 这个是指当前类、当前类的派生类都可以使用的,不管这个派生类在不在当前程序集内部
internal这个是指只要在当前程序集里的,都能访问,
protected internal这个是指当前程序集里的当前类、当前类的派生类都可以使用,但,其它程序集派生当前类的不能使用,
3. 类成员缺省的访问修饰符是() 1. pubilc 2. private 3. Internal
从你发的手机截图可以看出,这个不是java语言编程!C#的类有五种不同的限制修饰符:默认是internal
C#修饰符:
public可以被任意存取;
protected只可以被本类和其继承子类存取;
nternal只可以被本组合体(Assembly)内所有的类存取。默认
protected internal唯一的一种组合限制修饰符,它只可以被本组合体内所有的类和这些类的继承子类所存取。
private只可以被本类所存取。
对于java修饰符,默认:default
pulbic 所有类可访问
protected 子类(可以不同包)和同包可访问
default 同包下可访问
private 类内(自己)可访问
4. c++类不声明访问修饰符 默认是什么
类 class默认为 private
在C++中 struct结构体,默认为public
5. C#定义类的访问修饰符是指什么意思
C# 共有五种访问修饰符:public、private、protected、internal、protected internal。作用范围如下表:
所以对于 class A 来说,protected 表示其本类(class Program)和子类(所有继承 classProgram 的类)可以访问;对于 class B 来说也一样。
6. javac编译一个已声明为public 的class文件,可是系统还是提示这个类是公共类,要在文件中声明,这时怎回事
访问修饰符:
public(公共) 可以任意访问
prodect(友好的) 在本类,哗仔子类,同包中进行访问
default(默认的) :如果不指定访问修饰符,默认是该类型;在本乱洞汪类,同一包中可以访问颤迅
private(私有的):只在本类中进行访问
7. 在C#编程中,访问修饰符控制程序
private
因为微软认为,只要你不对此类进行修饰的话,则此类就会被保护起来,
他们对安全性也出于考虑,这也是一种习惯,所以我们在写C#程序的时候,一般要想别人可以访问的话,就只好用public来修饰
所以默认的是 private
上面那老兄看书了没有啊,答案不是乱说的,
也许这是基础,高手也许不会太在意这东西,但是C#中默认类的修饰符确实是
private
public是java中的编程风格,类默认都是public的
8. 在c语言中修饰符的用法
const
首先需要注意的是,const修饰的是在它前面的类型,如果它前面没有类型,那它修 饰的是紧跟着它的那个类型。 例如:
(a)const int i = 0; 和 (b)int const i = 0; 是完全一样的。
在(a)中,const前面没有类型,它就修饰它后面的那个int类型。在(b)中,const修饰它前 面的int类型,两者没有任何区别。
再看另一个稍复杂一点的例子,下面两条语句却不相同: (c)const int *pi = 0;
/* 相当于int const *pi = 0; pi是一个指向const int的指针,复引用此运算符为得到一 个const int的类型,该类型不能作为左值,在该语句后使用类似于*pi = 1的操作将导致 编译错误。但该变量本身并不具备const属性,可以使用pi = &i的操作。可用于访问只读 存储器。*/
(d)int* const pi = 0;
/* pi是一个指向int类型的const指针,复引用此运算符为得到一个int类型,该类型可以 作为左值,在该语句可以使用类似于*pi = 1的操作,但该变量本身具备const属性,使用 pi = &i的操作将导致编译错误。可用于访问固定位置的存储器。*/ 再看一个更复杂的例子:
(e)const int* const pi = 0;
/* pi和*pi均不能作为左值。它只适合于读取某个固定位置的只读存储器 */
const还有下列典型用法:
* 用于参数列表,通常修饰的是指针类型,表明该函数不会试图对传入的地址进行写 操作。例如:
void *memcpy(void *, const void *, size_t);
* 用于返回值,通常是一个指向只读区域的指针。例如: const datatype_t *get_fixed_item(int index);
* 给固定不变的数据(例如码表)加上只读属性,在某些情况下可以减小ram的开销。
2.static
static用于全局变量声明和局部变量声明具有完全不同的语义,不得不说,这是C语 言设计中的一个不合理之处。当static用于修饰全局变量声明(或函数声明,可以认为函数 声明就是声明一个指向代码段的指针,该指针的值最后由链接时决定,从这个意义上说, 函数声明也是一种全局变量声明),它表示该变量具有文件作用域,只能被该源文件的代码 引用,不能被其他源文件中的代码访问。在编译时引起的实际变化是被static修饰的变量 不会被写入目标文件的输出节,在链接时解析其他模块中的未定义符号时不会被引用到。 它的反义词是extern。
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
例如:
------main.c---
extern int a(void);
int main(){ return a(); } ------a.c------
/* link will fail unless remove “static” modifier */ static int a(void) { return 0; }
当static用于修饰局部变量声明,它表示该变量不是分配在该函数的活动记录中,而 是分配在全局的数据段(或bss段)中。简单的说,就是被static修饰的局部变量实际上并不 是局部变量,而是具有函数作用域的全局变量,除了只能在定义它的函数内访问外(这是由 C语法决定的),它的运行时特征和全局变量完全一样,函数返回不会影响它的状态,它的 初始化仅有一次,发生在程序的装载时,而不是在每次函数调用的时候初始化。它的反义 词是auto。
例如, 下面这段函数返回自己被调用了多少次: int callee(void) {
static int times_called = 0; return (++ times_called); }
3.volatile
volatile修饰符的作用是告诉优化器不能优化这个变量的读写操作,一定要为这个变 量的读写操作生成代码。 例如:
/* 延时操作 */ int foo(void) {
/* 100次减法后返回 */
volatile int i = 100; /*(a)*/ while (i > 0) i--; /*(b)*/ return 0; }
在无volatile修饰的情况下,因为变量i的变化对上下文无影响,所以优化器很可能 会省略掉对i操作的代码,而只生成return 0的代码,加上volatile可以保证编译器一定为 语句(a)和(b)生成代码,达到延时的目的。
/* 设备状态判定 */
int uart_write_char(int c) {
/* 向串口发送寄存器写入待发送字符 */
*(volatile unsigned int *)UART_TX_REG = c; /* 判断是否已发送*/
while ( (*(volatile unsigned int *)UART_STATUS_REG & TX_BIT) != 0); /*(c)*/
return 0; }
在语句(c)中,如果不使用volatile,优化器可能会因为在两次读取UART_STATUS_RE G之间没有对UART_STATUS_REG的写操作而将读取操作外提到循环体外而导致死循环。