c的访问修饰符
static修饰符可以使函数仅在当前模块(文件)中有效,外部模块无法调用static修饰的函数;
如果全局存在同名的函数,则static会屏蔽掉全局函数,相当于在当前模块中重载这个函数.
B. 在C#编程中,访问修饰符控制程序
private
因为微软认为,只要你不对此类进行修饰的话,则此类就会被保护起来,
他们对安全性也出于考虑,这也是一种习惯,所以我们在写C#程序的时候,一般要想别人可以访问的话,就只好用public来修饰
所以默认的是 private
上面那老兄看书了没有啊,答案不是乱说的,
也许这是基础,高手也许不会太在意这东西,但是C#中默认类的修饰符确实是
private
public是java中的编程风格,类默认都是public的
C. C的修饰符有哪些
static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。
extern:修饰符:修饰变量,函数。修饰变量时候,变量的声明在外面,修饰函数的时候,如果函数已经声明,则作用不是很大。
const:修饰符:修饰变量,函数。修饰变量时候,不能被重复赋值,只能放在只读段中。修饰函数时候,表明函数的返回值必须为常数。
volatile:(嵌入式程序员必须掌握的)volatile最初的意思是表示汽油容易挥发,在c中的作用大概有两点(1)表示变量是易失的,易变的。(2)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存。
D. 在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的写操作而将读取操作外提到循环体外而导致死循环。
E. 理解C语言中几个常见修饰符
格式符其实是占位符,它后面对应的数据实际上是堆栈,具体可以先学数据结构;至于转义字符什么的,一般的编程语言中都有,主要是为了与语言使用的字符相区别
F. C中访问修饰符有哪几种
public
公有访问。不受任何限制。private
私有访问。只限于本类成员访问,子类,实例都不能访问。protected
保护访问。只限于本类和子类访问,实例不能访问。internal
内部访问。只限于本项目内访问,其他不能访问。protected
internal
内部保护访问。只限于本项目或是子类访问,其他不能访问
G. C#定义类的访问修饰符是什么意思
protected 只是限制成员访问,无关内部对象,
就好象你的代码中,A和B同在一个类中,那么可以说是所在Program类,
派生类 就是继承自当前类的子类
再定义类C
classProgram
{
staticvoidMain(string[]args)
{
Aa=newA();
Bb=newB();
}
protectedclassA
{
}
protectedclassB:A
{
}
}
classC:Program
{
//那么这个地方就可以这样写
//一样可以通过
publicvoidtesta()
{
Aa=newA();
}
}
H. 什么是访问控制符有哪些访问控制符哪些可以用来修饰类哪些用来修饰域和方法试述不同访问控制符的作用
一,非访问修饰符。
1, 抽象类:
凡是用abstract修饰符修饰的类被称为抽象类。抽象类就是没有具体对象的概念类。
抽象类是一种经过优化的概念组织方式:把共同特点抽象出来;其后在描述和处理某一种具体对象时,就只需描述不同的特殊之处。这种组织方式使得所有的概念层次分明,简洁洗练,非常符合人们日常的思维习惯。
由于抽象类是它的所有子类的公共属性的集合,所以使用抽象类的一个优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。
值得一提的是,面向对象技术是要用更接近于人类思维方式的方法来处理实际问题,抽象类的设立就是这种思想的具体体现之一,它是模仿人类的思维模式的产物。
2,最终类:
如果一个类被final修饰符所修饰和限定,说明这个类不可能有子类。
被定义为final的类通常是一些有固定作用、用来完成某种标准功能的类。如Java系统定义好的用来实现网络功能的InterAddress、Socket等类都是final类。
abstract和final修饰符不能同时修饰一个类,因为abstract类自身没有具体对象,需要派生出子类后在创建子类的对象;而final类不可能有子类。这样放在一起修饰就没有意义了。
3,有些类的修饰符也可以用来修饰类中的域或方法:
(1) 域:是类和对象的静态属性,定义域的操作就是说明变量或创建对象的操作。
<1> 静态域:
用static修饰符修饰的域是仅属于类的静态域。静态域是类中每个对象共享的域。他们是类的域,不属于任何一个类的具体对象。是一个公共的存储单元,任何一个类的对象访问它时,取到的都是相同的数值。
<2> 静态初始化器:
静态初始化器是由关键字static引导的一对大括号括起的语句组。作用是:在加载时,初始化类的静态域。
与构造函数相同,他们都是用来完成初始化的工作,但是静态初始化器与构造函数有三点不同:
①构造函数是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化。
②构造函数是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载到内存时由系统调用执行。
③不同于构造函数,静态初始化器不是方法,没有方法名、返回值和参数列表。
<3> 最终域:
用final修饰的域,实际上就是Java中的常量。
用final修饰符说明常量时,需要注意以下几点:
①需要说明常量的数据类型。
②需要同时指出常量的具体取值。
③因为所有类对象的常量成员,其数值都固定一致,为了节省空间,常量通常声明为static。
<4> 易失域:
如果一个域被volatile修饰符所修饰,说明这个域可能同时被几个线程所控制和修改,即这个域不仅仅被当前程序所掌握,在运行过程中可能在其他未知的程序操作影响和改变该域的取值。在使用当中应该特别注意。
通常,volatile用来修饰接受外部输入的域。如表示当前时间的变量将系统的后台线程随时修改,以保证程序中取到的总是最新的当前系统时间,所以可以把它定义为易失域。
(2)方法:是类的动态属性,标志了类所具有的功能和操作。小括号是方法的标志。
<1> 抽象方法:
修饰符abstract修饰的抽象方法是一种仅有方法头,而没有具体的方法体和操作实现的方法。使用抽象方法的目的是使所有的子类,对外都呈现一个相同名字的方法,是一个统一的接口。所有的抽象方法,都必须存在于抽象类之中。
<2> 静态方法:
用static修饰符修饰的方法,是属于整个类的类方法,不用的是对象或实例的方法。调用这种方法时,应该使用类名作前缀;这种方法在内存中的代码段将随着类的定义而分配和装载,不被任何一个对象专有;只能处理属于整个类的成员变量。
<3> 最终方法:
用final修饰符修饰的类方法。功能和内部语句不能再更改的方法,不能再被继承。
注意:所有已被private修饰符限定为私有的方法,以及所有包含在final类中的方法,都被缺省地认为是final的。
<4> 本地方法:
用native修饰符声明其他语言书写方法体并具体实现方法功能的特殊的方法。这里的其他语言包括C/C++/FROTRAN/汇编等。由于native的方法的方法体使用其他语言在程序外部写成,所以所有的native方法都没有方法体,而用一个分号代替。
<5> 同步方法:
如果synchronized修饰的方法是一个类的方法(即static的方法),那么在被调用执行前,将把系统类Class中对应当前类的对象加锁。如果synchronized修饰的是一个对象的方法(未用static修饰的方法),则这个方法在被调用执行前,将把当前对象加锁。Synchronized修饰符主要用于多线程共存的程序中的协调和同步。
二,访问控制符。
访问控制符是一组限定类、域或方法是否可以被程序里的其他部分访问和调用的修饰符。类的访问控制符只有一个public,域和方法的访问控制符有四个,分别是public、private、protected、private protected,另外还有一种没有定义专门的访问控制符的缺省情况。
1, 公有访问控制符public:
Java的类是通过包的概念来组织的,包氏类的一个松散的集合。处于同一个包中的类可以不需要任何说明而方便的互相访问和引用,而对于不同包中的类,则不行。但当一个类被声明为public时,他就具有了被其他包中的类访问的可能性,只要这些其他包中的类在程序中使用import语句引入public类,就可以访问和引用这个类。
类中被设定为public的方法是这个类对外的接口部分,避免了程序的其他部分直接去操作类内的数据,这实际就是数据封装思想的体现。
每个Java程序的主类都必须是public类,也是基于相同的原因。
用public修饰的类的域称为公共域。如果公共域属于公共类,则它能被所有的其他类所引用。public修饰符会造成安全性的数据封装性下降,所以一般应减少public域的使用。
2, 缺省访问控制符:
缺省访问控制权规定,该类只能被同一个包中的类访问和引用,而不可以被其他包中的类使用,这种访问特性又称为包访问性。
同样道理,类内的域或方法如果美育访问控制符来限定,也就具有包访问性。
简单说,定义在同一个程序中的所有类属于一个包。
3,私有访问控制符private :
用private修饰得域或方法只能被该类自身所访问和修改,而且不能被任何其他类(包括该类的子类)来获取和引用。private修饰符用来声明那些类的私有成员,它提供了最高的保护级别。
4,保护访问控制符protected :
用protected修饰的成员变量可以被三种类所引用:该类自身、与它在同一个包中的其它类、在其他包中的该类的子类。使用protected修饰符的主要作用是允许其他包中该类的子类来访问父类的特定属性。
5,私有保护访问控制符 private protected :
用private protected修饰的成员变量可以被两种类访问和引用,一种是该类本身,一种是该类的所有子类。把同一个包内的非子类排除在可访问的范围之外,使得成员变量更专于具有明确继承关系的类,而不是松散地组合在一起的包。
I. c#程序设计中访问修饰符有什么作用
有作用啊,访问修饰符可以限定程序访问的层次。
默认是internal :
C#用多种修饰符来表达类的不同性质。根据其保护级C#的类有五种不同的限制修饰符:
public可以被任意存取;
protected只可以被本类和其继承子类存取;
internal只可以被本组合体(Assembly)内所有的类存取,组合体是C#语言中类被组合后的逻辑单位和物理单位,其编译后的文件扩展名往往是“.DLL”或“.EXE”。
protected internal唯一的一种组合限制修饰符,它只可以被本组合体内所有的类和这些类的继承子类所存取。
private只可以被本类所存取。
如果不是嵌套的类,命名空间或编译单元内的类只有public和internal两种修饰。
new修饰符只能用于嵌套的类,表示对继承父类同名类型的隐藏。
abstract用来修饰抽象类,表示该类只能作为父类被用于继承,而不能进行对象实例化。抽象类可以包含抽象的成员,但这并非必须。abstract不能和new同时用。下面是抽象类用法的伪码:
abstract class A
{
public abstract void F();
}
abstract class B: A
{
public void G() {}
}
class C: B
{
public override void F()
{
//方法F的实现
}
}
抽象类A内含一个抽象方法F(),它不能被实例化。类B继承自类A,其内包含了一个实例方法G(),但并没有实现抽象方法F(),所以仍然必须声明为抽象类。类C继承自类B,实现类抽象方法F(),于是可以进行对象实例化。
sealed用来修饰类为密封类,阻止该类被继承。同时对一个类作abstract和sealed的修饰是没有意义的,也是被禁止的。