C++语法疑点
1函数模板不支持偏特化
2类内部的typedef 必须放在最前面,不然没法用:
疑问:为什么类声明处定义的函数体中能出现在后面在声明的成员变量??因为C++对于成员函数函数体的解析是放在整个类声明完毕之后的.
3const vs nonconst member function
注意成员函数的const属性限定并不出现在重载决议中,如果在一个基类中定义了一个成员函数memfunc1(), 然后定义了它的nonconst version
则在派生类里面无论定义一个 const memberfunc1()还是nonconst memberfunc1(),都会覆盖基类的那两个函数,比如下面代码:
class Base{
public:
virtual void sayHello()
{
static int local = 0;
local++;
a = local;
cout << "hello from nonconst"<<endl;
cout << a;
}
virtual void sayHello() const
{
cout << "hello from const" << endl;
}
private:
int a;
};
class Derived:public Base
{
public:
void sayHello()
{
cout << "derived" << endl; //派生类的const 对象再也调用不了sayHello函数了
}
};
关于这一点,可以参考访问控制权限类似的设计,因为名字决议是先于访问控制权限的检查的
4函数返回值并不在name mangling之列,所以从这个角度讲,函数调用也没有达到绝对的类型安全(返回值搞错了的话编译器是检查不出来的)
5 pointer to data member
首先要意识到这是一种指针(可以赋值为nullptr,那样用%d就输出 -1),用printf(%d)输出的就是所指成员变量在类中的偏移
#include<iostream>
using namespace std; class Point3d
{
public:
//virtual ~Point3d(){} //static Point3d origin;
float x;
float y;
float z;
}; struct Base1{int val1;};
struct Base2{int val2;}; struct Derived:Base1, Base2{}; void func1(int Derived::*dmp, Derived* p, const Derived& p2)
{
cout << p->*dmp << endl;
cout << p2.*dmp << endl;
}
int main(int argc, char** argv[])
{
Point3d p;
float Point3d::*p1 = nullptr;
float Point3d::*p2 = &Point3d::x;
if(p1 == p2)
cout << "YES";
printf("%d %d\n", p1, p2);
Derived d1, d2;
d1.val1 = 2, d1.val2 = 3;
d2.val1 = 4, d2.val2 = 5;
func1(&Derived::val1, &d1, d2);
return 0;
}
6关于调用虚函数的开销
区分三种类型:普通对象,引用类型,指针类型
指针不用说,额外增加是间接性很容易理解
引用类型调用函数的格式看起来和对象类型是一致的,但调用虚函数的开销却和指针一样
普通对象调用虚函数就像调用一般的函数一样,没有额外开销
7violatile关键字修饰的作用
被volatile关键字所修饰的变量,只不过是每次使用的时候,都必须从(原始的)(存储变量内容的) 内存 中读取数据,写数据也应该要保证写到内存中去
不允许寄存器优化
8基于函数指针和直接的函数名的调用方式上完全一样:
这完全是为了方便.
还有一点,函数地址和数据地址是两个东西(一个指示代码段,一个指示数据段),所以把void*类型变量赋值成函数指针是错误的做法!
9 In C++, tentative definitions are not supported
10 One difference between C and C++, then, is the relative unimportance of the BSS data segment in C++. All global objects within C++ are treated as initialized.
C++语法疑点的更多相关文章
- 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法
一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...
- 【疑点】js中的break,continue和return到底怎么用?
转: [疑点]js中的break,continue和return到底怎么用? 为什么要说个?好像很简单,但是我也会迷糊,不懂有时候为什么要用return,然而break和continue也经常和他放在 ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- 探索C#之6.0语法糖剖析
阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- Velocity初探小结--velocity使用语法详解
做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- C#语法糖大汇总
首先需要声明的是"语法糖"这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕 ...
随机推荐
- Rest接口中正则表达式
匹配所有字符: @Path("/server/{urlParam: .*}")
- IIS提示Server Application Unavailable
浏览器访问网站,IIS提示Server Application Unavailable,我的解决方式是进入IIS管理界面,找到对应的站点,之后重启这个站点.
- 修复iPhone的safari浏览器上submit按钮圆角bug
今天在公司写了一个登录页面效果,让我碰到一个怪异的问题——"表单中的input type=submit和input type=reset按钮在iPhone的safari浏览器下圆角有一个bu ...
- 5.6 WebDriver API实例讲解(16-30)
16.操作单选框 被测试的网页为Demo1. Java语言版本的API实例代码: public static void operateRadio(){ driver.get("file:// ...
- Rectangle Intersection Test (with C#)
Rectangle Intersection Test (with C#) by Sebastian Krysmanskihttp://manski.net/2011/05/rectangle-int ...
- 通配符+countif()解决大于15位数的计数问题
excel的最大精度是15位,如果一个单元格中存储的数字超过15位,那么函数在计算的时候将会出现问题,它们会将15位之后的数字变成0. 在这种情况下,需要在函数中加入通配符,例如,统计A列中,A1出现 ...
- think in java 读书笔记 3 —— 数据报
目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...
- 【转载】SAP的标准对话框函数
http://blog.sina.com.cn/s/blog_721b218c01012j0y.html 在用户设计sap的程序时,经常需要一些对话框,用户可以自己编写,但使用SAP系统中提供了的对话 ...
- 函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
在dllimport中加入CallingConvention参数就行了,[DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = ...
- CI框架 输入类
1.$this->input->post() 第一个参数是所要取得的post中的数据: $this->input->post('some_data'); 如果数据不存在,方法将 ...